这几天写的单链表

  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("请输入你想查找的位置
");
 45     scanf("%d", &n);
 46     if (n <= 0) {
 47         return printf("你所输入的位置有误
");
 48     }
 49     for (int i = 1; i < n; i++) {
 50         p = p->next;
 51     }
 52     if (p == NULL)/*NULL常用来表示空指针*/ {
 53         return printf("这个位置没有数字
");
 54     }
 55         return printf("查找成功值为%d
", 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("请输入你想查找的值
");
 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("没有找到该值
");
 71     }
 72     return printf("该值的位置在第%d个
", 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("请输入你想插入第几个位置后面
");
 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("请输入你想插入的值
"); 
 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("请输入你想删除的数据位置
");
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("你所输入的位置不规范
");
112     }
113     q = p->next;
114     p->next=q->next;
115     free(q) ;
116 
117     return printf("删除成功
");
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("链表中暂时没有元素
"); 
126     } 
127     while (p!= NULL) {
128         int i=1;
129         printf("%d  ",p->data);
130         p=p->next;
131     }
132     printf("
");
133     printf("输出成功
");
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("请输入你想输入的长度
");
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("
");
146         scanf("%d", &m);
147         S->data = m;
148         p->next=S;
149         p=p->next; 
150     }
151     p->next=NULL;
152 
153     printf("创建成功
");
154 }
155 //改变元素 
156 int  Change(SLink *&L){
157     SLink *pre=L;
158     SLink *p=pre->next;
159     int n,m;
160     printf("请输入你想改变的数位置
");
161     scanf("%d",&n);
162     for(int i=1;i<n;i++){
163         p=p->next;
164     }
165     if(p==NULL){
166         return printf("该位置超出链表范围
"); 
167     }
168     printf("请输入你想改成的数字
");
169     scanf("%d",&m); 
170     p->data=m;
171     return printf("恭喜你改成功!
"); 
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
",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("删除成功
"); 
199 } 
200 //主函数
201 int main() {
202     SLink *L;
203 while(true){
204   printf("|||||||||||||||||||||||||||||||||||||||||||||||
");
205   printf("||  1:创建并输入单链表                      ||
");
206   printf("||  2:从指定位置删除一个数                  ||
");
207   printf("||  3:查询数的位置                          ||
");
208   printf("||  4:将元素插入指定位置                    ||
");
209   printf("||  5:改变某位置元素                        ||
");
210   printf("||  6:打印顺序表                            ||
");
211   printf("||  7: 求该链表的最大值                      ||
");
212   printf("||  8: 删除链表中的奇数                      ||
");
213   printf("||  9: 销毁链表                              ||
");
214   printf("||  (输入-1退出系统)                         ||
");
215   printf("|||||||||||||||||||||||||||||||||||||||||||||||
");
216         int n;
217         printf("请输入操作序号:
");
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 }
原文地址:https://www.cnblogs.com/longlonglonglong/p/10939885.html