// Note:Your choice is C++ IDE #include <stdio.h> #include <malloc.h> typedef struct LNode { int data; LNode* next; }LNode,*cirLinkList; /* 初始化一个循环链表,分为两步: ①:为它申请一个头结点. ②:令他的头结点的指针指向其自身. */ void InitCirLinkList(cirLinkList &t) { t = (cirLinkList)malloc(sizeof(LNode)); // malloc a head node. t->next = t; } /* 获得循环链表中一个结点的值. 情况: ①:链表为空. ②: 链表不为空,i值非法. */ int LocateElem(cirLinkList &t,int i) { cirLinkList p = t->next; //指向第一个结点 int j = 1;// 计数. /* p != t用来判断链表是否结束,即正常情况下 ,循环结束后,即j == i,此时链表也不 应该结束. 若是循环提前结束,即p == t.此时便可以判断i值非法.即i值超过了链表的 长度. */ while (p != t && j < i) { p = p->next; ++j; } if (p == t || i < 1) { printf("ileagle position or empty list./n"); exit(0); } return p->data; } /* 往循环链表中插入一个结点. */ void InsertList(cirLinkList &t,int elem) { /* 寻找最后一个结点.这里分为两种情况: Ⅰ 链表为空表. Ⅱ 链表非空. */ cirLinkList p = t; while (p->next != t) { p = p->next; } cirLinkList q = (cirLinkList)malloc(sizeof(LNode)); q->data = elem; p->next = q; q->next = t; //让q为链表的最后一个元素. } /* 从链表中删除一个结点. 情况: ① : 链表为空. ②: 链表非空. i值不合法 */ int DeleteList(cirLinkList &t,int i) { cirLinkList p = t; int j = 1; /* 判断p的下一个是否是头结点.若是说明循环结束, 若此刻计数j若仍未增加到i,说明i值不合法. */ while (p->next != t && j < i) { p = p->next; ++j; } if (p->next == t || i < 1) { printf("ileagle position or empty list./n"); exit(0); } cirLinkList q = p->next; p->next = p->next->next; free(q); } int main(int argc, char *argv[]) { cirLinkList t; InitCirLinkList(t); InsertList(t,3); //printf("%d ",LocateElem(t,1)); for (int i = 0; i < 10; ++i) { InsertList(t,i); } for (int j = 1; j <= 10; ++j) { printf("%d ",LocateElem(t,j)); } return 0; }