1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef
int datatype;
5
6 typedef
struct node
7 {
8 datatype data;
9 //定义结构体类型指针,指向结构体中的元素
10 struct node *
next;
11 }linklist,*linklist_p;
//等价为typedef struct node * linklist_p,用linklist_p代替struct node *
12 //给链表开辟空间,链表的第一个位置的元素指向空指针
13 linklist_p create_linked();
14 //头插入
15 int insert_head(linklist_p L,datatype value);
16 //输出打印链表
17 void show_list(linklist_p L);
18 //头删除
19 int del_head(linklist_p L);
20 //判断链表是否为空,空返回1,非空返回0
21 int empty_list(linklist_p L);
22 //根据给定的value值,插入元素
23 int insert_order(linklist_p L,datatype value);
24 //根据给定的value值删除链表元素
25 int del_order(linklist_p L,datatype value);
26 //更改链表元素
27 void exch_list(linklist_p L, datatype old,datatype
new);
28 //查找链表元素
29 int find_list(linklist_p L,datatype value);
30 //对链表元素进行反转。输出1234反转为4321
31 void reverse_list(linklist_p L);
32 int main(
int argc,
const char *
argv[])
33 {
34 //给链表开辟空间,首地址为L
35 linklist_p L =
create_linked();
36 //判断函数是否调用成功
37 if(NULL ==
L)
38 {
39 printf(
"函数调用失败\n");
40 return -
1;
41 }
42 //依据value值插入数据
43 insert_order(L,
2);
44 insert_order(L,
3);
45 insert_order(L,
4);
46 insert_order(L,
3);
47 show_list(L);
48 //删除数据
49 del_order(L,
4);
50 show_list(L);
51 exch_list(L,
3,
4);
52 show_list(L);
53 printf(
"%d\n",find_list(L,
3));
54 //链表反转
55 reverse_list(L);
56 show_list(L);
57 return 0;
58 }
59
60 linklist_p create_linked()
61 {
62 linklist_p L =(linklist_p) malloc(
sizeof(linklist));
63 if(NULL ==
L)
64 {
65 printf(
"内存开辟失败\n");
66 return NULL;
67 }
68 //链表的第一个位置指向空指针
69 L->next =
NULL;
70 return L;
71 }
72 //头插入,新开辟一块内存空间,地址为p,其中p->next指向L->next(第一次为空),L->next地址为p,指向新开辟的内存空间
73 int insert_head(linklist_p L,datatype value)
74 {
75 linklist_p p = (linklist_p)malloc(
sizeof(linklist));
76 if(p ==
NULL)
77 {
78 printf(
"内存开辟失败\n");
79 return -
1;
80 }
81 p->next = L->
next;
82 L->next =
p;
83 p->data =
value;
84 return 0;
85 }
86 //打印输出链表空间,判断条件是链表的最后一个元素指向空指针NULL
87 void show_list(linklist_p L)
88 {
89 linklist_p p = L->
next;
90 while(p->next!=
NULL)
91 {
92 printf(
"%d",p->
data);
93 p = p->
next;
94 }
95 printf(
"%d\n",p->
data);
96 }
97 //头删除,将L->next赋值给p,即删除第一个有data值的元素,将其下一位的地址即p->next赋值给L->next
98 int del_head(linklist_p L)
99 {
100 linklist_p p = L->
next;
101 if(empty_list(L))
102 {
103 printf(
"链表为空,无法删除\n");
104 return -
1;
105 }
106 L->next = p->
next;
107 free(p);
108 p = NULL;
//记得将删除的元素地址指向空指针
109 return 0;
110 }
111
112 int empty_list(linklist_p L)
113 {
114 return L->next == NULL?
1:
0;
115 }
116
117 //依据value值大小对链表进行插入
118 int insert_order(linklist_p L,datatype value)
119 {
120 //定义两个结构体指针:q用来遍历链表,p作为开辟的内存空间的地址,开辟空间之前首先指向空指针进行初始化
121 linklist_p p =NULL, q =
L;
122 //遍历链表,比较q的下一个元素与value的大小,当其值不大于value值时,继续遍历数组,并且遍历之后发现value最大,满足q->next为NULL
123 while(q->next != NULL && q->next->data <=
value)
124 {
125 q = q->
next;
126 }
127 //当q的下一个元素大于value时,需将存储在新开辟的内存空间的地址为p的元素插入到q之后
128 if((p=(linklist_p)malloc(
sizeof(linklist))) ==
NULL)
129 {
130 printf(
"分配地址失败\n");
131 return -
1;
132 }
133 //给p这个元素赋值value
134 p->data =
value;
135 //先将p指向q的下一个元素
136 p->next = q->
next;
137 //q指向p,完成插入
138 q->next =
p;
139 return 0;
140
141 }
142
143 //删除指定元素(按照指定alue值进行)只删除第一个元素
144 int del_order(linklist_p L,datatype value)
145 {
146 linklist_p p = L,q =
NULL;
147 while(p->next != NULL&&p->next->data !=
value)
148 {
149 p = p->
next;
150 }
151 if(p->next !=
NULL)
152 {
153 q = p->
next;
154 p->next = q->
next;
155 free(q);
156 q =
NULL;
157 }
158 return 0;
159 }
160
161 //替换
162 void exch_list(linklist_p L, datatype old,datatype
new)
163 {
164 linklist_p p =
L;
165 while(p->next != NULL && p->next->data !=
old)
166 {
167 p = p->
next;
168 }
169 p->next->data =
new;
170 }
171
172 //查找
173 int find_list(linklist_p L,datatype value)
174 {
175 while(L->next !=
NULL)
176 {
177 if(L->next->data ==
value)
178 return 1;
179 L = L->
next;
180 }
181 return 0;
182 }
183
184 //倒转链表,假设链表为123,倒转之后为321
185 void reverse_list(linklist_p L)
186 {
187 //定义两个结构体指针,p指向头元素之后的一个元素,q指向空指针
188 linklist_p p = L->next,q =
NULL;
189 //将头元素拿出并指向空指针
190 L->next =
NULL;
191 //对剩余的元素进行遍历,从头元素之后的一个元素开始
192 while(p !=
NULL)
193 {
194 //将头元素之后的第一个元素拿出,将其地址赋值给q
195 q =
p;
196 //此时p指向头元素之后的第二个元素
197 p = p->
next;
198 //此时q(即拿出的头元素之后的第一个元素)指向空指针(原头元素所指向位置)
199 q ->next = L->
next;
200 //头元素指向q(拿出的头元素之后的第一个元素)
201 L->next =
q;
202 //此后继续遍历,头元素之后的第二个元素放在头元素和第一个元素之间
203 }
204 }
转载于:https://www.cnblogs.com/billcharint/p/10724537.html