最近在准备考研数据结构,在此记录一下平日遇到的问题。
此题是《算法与数据结构-C语言描述》,第四章算法题第八个
#include#include #define OK 1 #define false 0 //定义循环单链表结点的结构 typedef struct linknode{ int data; struct linknode *next; }linknode; typedef struct{ struct linknode *rear; }linklist; //初始化循环单链表 int initlink(linklist *s){ s->rear=(linknode*)malloc(sizeof(linknode)); if(s->rear==NULL) return false; s->rear->next=s->rear;//尾指针的下一个结点还是指向自己 return OK; } int insertlink(linklist *s,int x){ linknode *p; p=(linknode*)malloc(sizeof(linknode)); if(p==NULL) return false;//内存分配空间失败 p->data=x; p->next=s->rear->next; s->rear->next=p; s->rear=p; } int createlink(linklist *s,int n){ int x; int i=0; linknode *p; printf("n输入元素值创建循环单链表n"); while(i data=x; // s->rear->next=p;//注释的这几行是一开始写错的地方,记录一下,最初我把它当成了普通单链表的尾插法,但是这个题是循环单链表,普通单链表尾指针指向的下一个结点是空,循环单链表尾指针指向的下一个结点是头结点 // p->next=NULL; // s->rear=p; p->next=s->rear->next; s->rear->next=p; s->rear=p; i++; } return OK; } int poplink(linklist *s){ linknode *p; if(s->rear->next==s->rear)//如果队空 return false; p=s->rear->next->next; s->rear->next->next=p->next; if(p==s->rear){//如果链表中只剩下一个结点,这个容易没有考虑到 s->rear=s->rear->next; } free(p); return OK; } int printflink(linklist *s){ linknode *p; p=s->rear->next->next; while(p!=s->rear->next){ printf("%d ",p->data); p=p->next; } return OK; } int main(){ linklist *s; int n,x; initlink(&s); printf("输入要创建元素的个数:"); scanf("%d",&n); createlink(&s,n); printf("n创建好后队列的值:n"); printflink(&s); printf("n输入要入队元素的值:n"); scanf("%d",&x); printf("n在队尾插入结点后:n"); insertlink(&s,x); printflink(&s); poplink(&s); printf("n队头元素出队之后:n"); printflink(&s); }



