本文实例为大家分享了C语言实现循环链表的具体代码,供大家参考,具体内容如下
注意事项:
1、循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。
2、注意传递的实参需要取地址
3、循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点)
4、在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额外更新一次),直接用头插法建立的是头指针,而非尾指针
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#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" ); } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_41951281/article/details/100777909