时间:2021-05-28 07:59:19 | 栏目:C代码 | 点击:次
本文实例为大家分享了C语言实现循环链表的具体代码,供大家参考,具体内容如下
注意事项:
1、循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。
2、注意传递的实参需要取地址
3、循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点)
4、在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额外更新一次),直接用头插法建立的是头指针,而非尾指针
代码:
#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node * next; }Node, *LinkList; LinkList Creat(); void Destroy(LinkList *L); void Insert(LinkList *L, int val, int index); void Delete(LinkList *L, int index); void Traverse(LinkList L); int main() { LinkList L = Creat(); Traverse(L); Insert(&L, 1, 5); printf("After inserting is :\n"); Traverse(L); printf("After deleting is :\n"); Delete(&L, 2); Traverse(L); Destroy(&L); Traverse(L); } LinkList Creat() { LinkList L = (LinkList)malloc(sizeof(Node));//用L指针指向新建结点,这里L还不算尾指针 int n; L->data = -1; L->next = L;//头结点的指针域指向头结点, 注意!这里是对尾指针的初始化。 printf("Please enter the number you want input:(>5)"); scanf_s("%d", &n); printf("input the number:\n"); for (int i = 0; i < n; i++) { LinkList p = (LinkList)malloc(sizeof(Node)); scanf_s("%d", &p->data); p->next = L->next; L->next = p; L = p; } return L;//返回尾结点的指针 } void Destroy(LinkList *L) { LinkList q = (*L)->next->next; LinkList p; (*L) = (*L)->next; while (q != (*L)) { p = q->next; free(q); q = p; } (*L)->next = (*L); } void Insert(LinkList *L, int val, int index) { LinkList p = (LinkList)malloc(sizeof(Node)); p->data = val; LinkList q = (*L)->next; for (int i = 1; q != (*L) && i < index; i++) q = q->next; p->next = q->next; q->next = p; if (p == (*L)) (*L) = p; } void Delete(LinkList *L, int index) { LinkList q = (*L)->next, p; for (int i = 0; i < index; i++) q = q->next; p = q->next; q->next = p->next; free(p); } void Traverse(LinkList L) { LinkList q = L->next->next;//这才是首元结点 while (q != L) { printf("%d->", q->data); q = q->next; } printf("NULL\n"); }