1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 typedef int/*这里为线性表数据元素类型*/ ElemType;
5 struct node {//单链表节点类型
6 ElemType data;
7 struct node *next;
8 };
9 typedef struct node SLink;
10 //为单链表结点类型struct node定义一个易记忆类型名SLink
11
12 //初始化单链表
13 void CreatList(SLink *L)/* &表示L是引用参数,*表示L是指针,L是指向LinkList数据的指针*/{
14 L = (SLink*)malloc(sizeof(SLink));//sizeof()是求一个类型的字节大小的,比如 sizeof(int )就是4.
15 //创建头结点
16 L->next = NULL;
17 }
18 //销毁单链表
19 void DestroyList(SLink *L) {
20 SLink* pre = L, *p = pre->next;
21 while (p != NULL) {
22 free(pre);
23 pre=p;
24 p = p->next;
25 }
26 free(pre);
27 }
28 //求单链表长度
29 int GetLength(SLink *L) {
30 SLink* pre = L;
31 SLink* p = pre->next;
32 int i=1;
33 while (p!= NULL) {
34 p = p->next;
35 i++;
36 }
37 return printf("该单链表长度为%d", i);
38 }
39 //求单链表中的第i个元素
40 int GetElem(SLink*& L) {
41 SLink* pre = L;
42 SLink* p = pre->next;
43 int n;
44 printf("请输入你想查找的位置\n");
45 scanf("%d", &n);
46 if (n <= 0) {
47 return printf("你所输入的位置有误\n");
48 }
49 for (int i = 1; i < n; i++) {
50 p = p->next;
51 }
52 if (p == NULL)/*NULL常用来表示空指针*/ {
53 return printf("这个位置没有数字\n");
54 }
55 return printf("查找成功值为%d\n", p->data);
56
57 }
58 //按值查找
59 int Locate(SLink*& L) {
60 SLink* pre = L;
61 SLink* p = pre->next;
62 int m,i=1;
63 printf("请输入你想查找的值\n");
64 scanf("%d", &m);
65 while (p->data != m&&p!=NULL) {
66 p = p->next;
67 i++;
68 }
69 if (p == NULL) {
70 return printf("没有找到该值\n");
71 }
72 return printf("该值的位置在第%d个\n", i);
73 }
74 //在指定位置插入元素
75 int insElem(SLink*& L){
76 SLink* pre = L;
77 SLink* p = pre->next;
78 int i,m;
79 SLink *NewNode = (SLink*)malloc(sizeof(SLink));
80 printf("请输入你想插入第几个位置后面\n");
81 scanf("%d", &i);
82 for (int k = 1; k < i; k++) {
83 p = p->next;
84 }
85 if (p == NULL) {
86 return printf("插入失败,未找到该结点");
87 }
88 printf("请输入你想插入的值\n");
89 scanf("%d", &m);
90 NewNode->data=m;
91 //p->next = NewNode;
92 //NewNode->next = p->next->next;
93 NewNode->next = p->next;
94 p->next = NewNode;
95 return printf("插入成功");
96
97 }
98 //删除元素
99 int DleElem(SLink*& L) {
100 SLink* pre = L;
101 SLink* p = pre->next;
102 SLink* q;
103 int n;
104 printf("请输入你想删除的数据位置\n");
105 scanf("%d", &n);
106 for (int i = 2; i < n; i++) {
107 p=p->next;
108 }
109 //这是删除p所在的后一个的结点;
110 if (p == NULL) {
111 return printf("你所输入的位置不规范\n");
112 }
113 q = p->next;
114 p->next=q->next;
115 free(q) ;
116
117 return printf("删除成功\n");
118 }
119 //输出单链表
120 int DisElem(SLink*& L) {
121 SLink* pre = L, * p,*q;
122 p = pre->next;
123 q=p->next;
124 if(p==NULL){
125 return printf("链表中暂时没有元素\n");
126 }
127 while (p!= NULL) {
128 int i=1;
129 printf("%d ",p->data);
130 p=p->next;
131 }
132 printf("\n");
133 printf("输出成功\n");
134 }
135 //创建和输入单链表
136 int CreateAndInputElemT(SLink*& L) {
137 L = (SLink*)malloc(sizeof(SLink));
138 L->next = NULL;
139 int n,m; SLink* S,*p=L;
140 printf("请输入你想输入的长度\n");
141 scanf("%d", &n);
142 for (int i = 0; i < n; i++) {
143 S = (SLink*)malloc(sizeof(SLink));
144 printf("请输入第%d个数", i + 1);
145 printf("\n");
146 scanf("%d", &m);
147 S->data = m;
148 p->next=S;
149 p=p->next;
150 }
151 p->next=NULL;
152
153 printf("创建成功\n");
154 }
155 //改变元素
156 int Change(SLink *&L){
157 SLink *pre=L;
158 SLink *p=pre->next;
159 int n,m;
160 printf("请输入你想改变的数位置\n");
161 scanf("%d",&n);
162 for(int i=1;i<n;i++){
163 p=p->next;
164 }
165 if(p==NULL){
166 return printf("该位置超出链表范围\n");
167 }
168 printf("请输入你想改成的数字\n");
169 scanf("%d",&m);
170 p->data=m;
171 return printf("恭喜你改成功!\n");
172 }
173 //求最大值
174 int GetMax(SLink *&L){
175 SLink *pre=L,*p;
176 p=pre->next;
177 int Max;
178 Max=p->data;
179 for(;p!=NULL;){
180 if(p->data>Max){
181 Max=p->data;
182 }
183 p=p->next;
184 }
185 return printf("该链表的最大值为%d\n",Max);
186 }
187 //将链表里奇数都删掉
188 int Delji(SLink *&L){
189 SLink *pre=L,*q;
190 for(;pre!=NULL;){
191 q=pre->next;
192 if(q->data%2!=0){//输入有限制-128至127.
193 pre->next=q->next;
194 free(q);
195 pre=pre->next;
196 }
197 }
198 return printf("删除成功\n");
199 }
200 //主函数
201 int main() {
202 SLink *L;
203 while(true){
204 printf("|||||||||||||||||||||||||||||||||||||||||||||||\n");
205 printf("|| 1:创建并输入单链表 ||\n");
206 printf("|| 2:从指定位置删除一个数 ||\n");
207 printf("|| 3:查询数的位置 ||\n");
208 printf("|| 4:将元素插入指定位置 ||\n");
209 printf("|| 5:改变某位置元素 ||\n");
210 printf("|| 6:打印顺序表 ||\n");
211 printf("|| 7: 求该链表的最大值 ||\n");
212 printf("|| 8: 删除链表中的奇数 ||\n");
213 printf("|| 9: 销毁链表 ||\n");
214 printf("|| (输入-1退出系统) ||\n");
215 printf("|||||||||||||||||||||||||||||||||||||||||||||||\n");
216 int n;
217 printf("请输入操作序号:\n");
218 scanf("%d",&n);
219 switch(n){
220 case 1 :
221 CreateAndInputElemT(*& L);
222 break;
223 case 2 :
224 DleElem(*& L);
225 break;
226 case 3 :
227 Locate(*& L);
228 break;
229 case 4 :
230 insElem(*& L);
231 break;
232 case 5 :
233 Change(*& L);
234 break;
235 case 6 :
236 DisElem(*& L);
237 break;
238 case 7 :
239 GetMax(*& L);
240 break;
241 case 8 :
242 Delji(*&L);
243 break;
244 case 9 :
245 DestroyList(L);
246 break;
247 case -1:
248 return 0;
249
250 }
251
252 }
253
254 }