单向循环链表
#include<stdio.h>
#include<stdlib.h>
#include"day3.h"
//创建的单向循环链表
LINK* creat_LINK()
{
LINK *MY_LINK=(LINK*)malloc(sizeof(LINK));
if(MY_LINK==NULL)
{
printf("创建失败\n");
return NULL;
}
MY_LINK->text.len=0;
MY_LINK->NEXT=MY_LINK;
return MY_LINK;
}
//头插
void insert_head(LINK*MY_LINK,typdata num)
{
LINK* temp=(LINK*)malloc(sizeof(LINK));
if(temp==NULL)
{
printf("创建失败");
return ;
}
//初始化
temp->text.data=num;
temp->NEXT=NULL;
//链接节点
temp->NEXT=MY_LINK->NEXT;
MY_LINK->NEXT=temp;
MY_LINK->text.len++;
}
//尾插
void insert_end(LINK*MY_LINK,typdata num)
{
LINK*temp=(LINK*)malloc(sizeof(LINK));
if(temp==NULL)
{
printf("尾插失败");
return;
}
temp->text.data=num;
temp->NEXT=NULL;
//链接尾部
LINK*P=MY_LINK;
while(P->NEXT!=MY_LINK)
{
P=P->NEXT;
}
temp->NEXT=P->NEXT;
P->NEXT=temp;
MY_LINK->text.len++;
}
//头删
void delet_head(LINK*MY_LINK)
{
if(MY_LINK->NEXT==MY_LINK)
{
printf("链表为空,头删失败\n");
return;
}
LINK*P=MY_LINK->NEXT->NEXT;
LINK*q=MY_LINK->NEXT;
MY_LINK->NEXT=P;
free(q);
MY_LINK->text.len--;
q=NULL;
}
//尾删
void delet_end(LINK*MY_LINK)
{
if(MY_LINK->NEXT==NULL)
{
printf("尾删失败\n");
return;
}
LINK*P=MY_LINK;
while(P->NEXT->NEXT!=MY_LINK)
{
P=P->NEXT;
}
free(P->NEXT);
P->NEXT=MY_LINK;
MY_LINK->text.len--;
}
//遍历数组
void read_data(LINK*MY_LINK)
{
LINK*P=MY_LINK;
while(P->NEXT!=MY_LINK)
{
P=P->NEXT;
printf("%d ",P->text.data);
}
printf("\n");
printf("链表个数是%d\n",MY_LINK->text.len);
}
双向链表
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include"doubleday2.h"
4
5 //创建带头结点的单链表
6 LINK* creat_LINK()
7 {
8 LINK *MY_LINK=(LINK*)malloc(sizeof(LINK));
9 if(MY_LINK==NULL)
10 {
11 printf("创建失败\n");
12 return NULL;
13
14 }
15 MY_LINK->text.len=0;
16 MY_LINK->NEXT=NULL;
17 MY_LINK->prev=NULL;
18 return MY_LINK;
19 }
20
21 //头插法
22 void head_inster(LINK* MY_LINK,typdata num)
23 {
24 LINK*temp1=(LINK*)malloc(sizeof(LINK));
25 if(NULL==temp1)
26 {
27 printf("头插创建失败\n");
28 return;
29 }
30 //初始化
31 temp1->text.data=num;
32 temp1->NEXT=NULL;
33 temp1->prev=NULL;
34
35 //链接头节点
36
37 if(MY_LINK->NEXT==NULL)//链表为空时
38 {
39 temp1->NEXT=MY_LINK->NEXT;
40 MY_LINK->NEXT=temp1;
41 temp1->prev=MY_LINK;
42 }
43 else
44 {
45 temp1->NEXT=MY_LINK->NEXT;
46 MY_LINK->NEXT=temp1;
47 temp1->NEXT->prev=temp1;
48 temp1->prev=MY_LINK;
49 }
50
51 //更新长度
52 MY_LINK->text.len++;
53
54 }
55 //尾部插入
56 void end_data(LINK*MY_LINK,typdata num)
57 {
58 LINK *P=MY_LINK;
59
60
61 while(NULL!=P->NEXT)
62 {
63 P=P->NEXT;
64 }
65
66
67 LINK*temp1=(LINK*)malloc(sizeof(LINK));
68 if(NULL==temp1)
69 {
70 printf("尾插创建失败\n");
71 return;
72 }
73 //初始化
74 temp1->text.data=num;
75 temp1->prev==NULL;
76 temp1->NEXT=NULL;
77
78 //链接上一个节点
79 if(MY_LINK->NEXT==NULL)//链表为空时
80 {
81 temp1->NEXT=MY_LINK->NEXT;
82 MY_LINK->NEXT=temp1;
83 temp1->prev=MY_LINK;
84 }
85 else
86 {
87
88 temp1->NEXT=P->NEXT;
89
90 P->NEXT=temp1;
91 temp1->prev= P;
92 }
93
94 //更新长度
95 MY_LINK->text.len++;
96
97
98 }
99 //按位置插入
100 void inster_xb(LINK*MY_LINK,typdata num,int n)
101 {
102 LINK*temp1=(LINK*)malloc(sizeof(LINK));
103 if(NULL==temp1)
104 {
105 printf("头插创建失败\n");
106 return;
107 }
108 //初始化
109 temp1->text.data=num;
110 temp1->NEXT=NULL;
111 temp1->prev=NULL;
112 LINK*P=MY_LINK;
113
114
115 for(int i=0;i<n-1;i++)
116 {
117 P=P->NEXT;
118 }
119
120 if(P->NEXT==NULL)
121 {
122 temp1->NEXT=P->NEXT;
123 P->NEXT=temp1;
124 temp1->prev=P;
125 }
126
127 else
128 {
129
130 temp1->NEXT=P->NEXT;
131 P->NEXT=temp1;
132
133 temp1->NEXT->prev=temp1;
134 temp1->prev=P;
135 }
136
137 MY_LINK->text.len++;
138
139
140 }
141
142 //获取数据
143 void read_date(LINK* MY_LINK)
144 {
145 LINK *P=MY_LINK;
146
147
148 while(NULL!=P->NEXT)
149 {
150 P=P->NEXT;
151 printf("%d ",P->text.data);
152 }
153
154 printf("\n");
155 printf("数据长度是%d\n",MY_LINK->text.len);
156 }
157
158 //头部删除
159 void delet_head(LINK*MY_LINK)
160 {
161 if(MY_LINK->text.len==0)
162 {
163 printf("链表为空");
164 return;
165 }
166 LINK *P=MY_LINK;
167
168 if(P->NEXT==NULL)
169 {
170 MY_LINK->NEXT=P->NEXT;
171 free(P);
172 P=NULL;
173
174 }
175 else{
176 P=P->NEXT;
177 MY_LINK->NEXT=P->NEXT;
178 P->prev=MY_LINK;
179
180
181 free(P);
182 P=NULL;
183 } MY_LINK->text.len--;
184
185
186 }
187 //从尾部删除
188 void delet_end(LINK*MY_LINK)
189 {
190 if(MY_LINK->NEXT==NULL)
191 {
192 printf("链表为空");
193 return;
194 }
195 LINK*P=MY_LINK;
196
197 while(NULL!=P->NEXT)
198 {
199
200 P=P->NEXT;
201
202 }
203
204 P->prev->NEXT=P->NEXT;
205
206 free(P);
207 P=NULL;
208 MY_LINK->text.len--;
209
210 }
211 //指定位置删除
212 void delet_WZ(LINK*MY_LINK,int n)
213 {
214
215 if(MY_LINK->NEXT==NULL)
216 {
217 printf("链表为空");
218 return;
219 }
220 LINK*P=MY_LINK;
221
222 for(int i=0;i<n;i++)
223 {
224 P=P->NEXT;
225 }
226 if(P->NEXT==NULL)
227 {
228 P->prev->NEXT=P->NEXT;
229 free(P);
230 P=NULL;
231 }
232
233 else
234 {
235
236 P->prev->NEXT=P->NEXT;
237 P->NEXT->prev=P->prev;
238 free(P);
239 P=NULL;
240 }
241
242 MY_LINK->text.len--;
243
244
245 }
246
247