#include #include #define BAOSHU 5 #define TOTAL 100 typedef int ElemType; typedef struct Node{ ElemType data; struct Node *next; }NODE,*NODEPT; typedef struct CircleLink{ NODEPT head; NODEPT tail; int nodeCount; }CIRCLELINK; //函数声明区域 void VisitCircleLink(CIRCLELINK *CL); void Ins_to_Tail(CIRCLELINK *CL,ElemType X); void DelNode(CIRCLELINK *CL,NODEPT PriorNdPT); void BaoShu(CIRCLELINK *CL); int main() { CIRCLELINK CircleLink1; CircleLink1.head=NULL; CircleLink1.tail=NULL; CircleLink1.nodeCount=0; for(int i=1;i<=TOTAL;i++) Ins_to_Tail( &CircleLink1 , i ); VisitCircleLink( &CircleLink1 ); BaoShu(&CircleLink1); printf("\ncomplete:"); VisitCircleLink( &CircleLink1 ); return 0; } void VisitCircleLink(CIRCLELINK *CL) { NODEPT tempNdPT=CL->head; int count=0; while(count++ < CL->nodeCount) { printf("%d ",tempNdPT->data); tempNdPT= tempNdPT->next; } } void Ins_to_Tail(CIRCLELINK *CL,ElemType X) { NODEPT newNdPT=(NODEPT)malloc(sizeof(NODE)); if(CL->head==NULL) CL->head=newNdPT; if(CL->tail) CL->tail->next=newNdPT; CL->tail= newNdPT; newNdPT->data=X; newNdPT->next= CL->head; CL->nodeCount++; } void DelNode(CIRCLELINK *CL,NODEPT PriorNdPT) { if(!PriorNdPT || !PriorNdPT->next) return; NODEPT DelNdPT=PriorNdPT->next; if(DelNdPT==CL->head&&DelNdPT==CL->tail) { //删除唯一的结点 CL->head=CL->tail=NULL; } else if(DelNdPT==CL->head) { //是第一个结点但不是尾结点 CL->head=DelNdPT->next; CL->tail->next=CL->head; } else if(DelNdPT==CL->tail) { //是尾结点但不是第一个结点 CL->tail=PriorNdPT; CL->tail->next=CL->head; } else { //删除中间结点 PriorNdPT ->next = DelNdPT->next; } CL->nodeCount--; free(DelNdPT); } void BaoShu(CIRCLELINK *CL) { NODEPT PriorNdPT = CL->head , DelNdPT; int baoshu=0; while( PriorNdPT && PriorNdPT->next ) { baoshu++; DelNdPT = PriorNdPT->next; if( CL->nodeCount <= 3) break; if(baoshu == BAOSHU-1) { printf("\nDel : %d", DelNdPT->data); DelNode(CL,PriorNdPT); baoshu=0; } PriorNdPT= PriorNdPT->next; } }