C循环链表操作模板

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <stdio.h>
#include <stdlib.h>


#define maxn 100    


typedef int DataType;    //将数据类型定义为DataType,方便修改,这样如果需要改成char只需要改这里就行了
typedef struct Node{
DataType data;
struct Node *next;
}Node;


Node *CreatList(DataType a[],int n){
Node *first = (Node*)malloc(sizeof(Node));
first->next = NULL;
Node *r = NULL,*p = NULL;
r = first;


for(int i = 0;i < n;i++){
p = (Node*)malloc(sizeof(Node));
p->data = a[i];
p->next = NULL;
r->next = p;
r = p;
}
p->next = first->next; //链表末端指向链表头
//此处是单链表和循环链表的差别


return first;


}




//删除第x位的元素
void DeleteData(Node *first,int x){
Node *p = first->next;
Node *r;
int cnt = 1;    //cnt统计结点数


while(p->next != first->next && cnt < x -1){ //判断是否遍历完成,当P为链表尾的时候,P->next应指向第一个元素,即first-next;
p = p->next;
}

//敲黑板划重点
//比如说链表中有数据 1 2 3 4 5
//要删除位置为3 (此时对应数据也是3)
//则令P指向第2个位置时停下来(修改指针域使P(此时P指向2)->next==P->next->next (p->next->next指向4)
r = p->next;
p->next = r->next;
free(r); //释放删除位的空间,防止内存泄漏


//如果要取得删除的数据
//则在函数声明中添加参数DataType *ptr
//并将要删除的数据赋值给×ptr后再free
}


//循环链表其他操作如果需要遍历,则类似此函数,设置一个标记flag即可
//具体函数可参考我博客中的C单链表操作
void PrintList(Node *first){
int flag = 0;//设置标记,当链表遍历完成后停止
Node *p = first->next;


while(p != first ->next || !flag){
printf("%d ",p->data);
p = p->next;
flag = 1;
}
}






int main()
{
Node* first = NULL;
int n;
int i,k = 2,x = 1;
DataType Data[maxn];


scanf("%d",&n);
for(i = 0;i < n;i++)
scanf("%d",&Data[i]);
first = CreatList(Data,n);


PrintList(first);


DeleteData(first,k);
printf("\nAfter Delete:\n");
PrintList(first);


return 0;
}
觉得文章不错的话可以请我喝一杯茶哟~
  • 本文作者: bestsort
  • 本文链接: https://bestsort.cn/2019/04/21/63/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!
-------------本文结束感谢您的阅读-------------