线性表:单链表基本操作代码

  1 此代码由https://fishc.com.cn/thread-46760-1-1.html转载
  2 
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 
  6 #define OK 1
  7 #define ERROR -1
  8 #define LEN sizeof(LinkList)
  9 
 10 typedef int Status;
 11 typedef int ElemType;
 12 
 13 typedef struct Node//声明结构体  定义单链表   //typedef struct LNode 
 14 {                                           //{
 15     ElemType data;                      //       ElemType  data;
 16     struct Node *next;                  //       struct LNode *next; 
 17 }LinkList;                                  //}LinkList;
 18 
 19 LinkList *InitList();
 20 Status HeadInsert(LinkList *L);
 21 Status PrintList(LinkList *L);
 22 Status TailInsert(LinkList *L);
 23 Status ListLength(LinkList *L);
 24 Status GetElem(LinkList *L);
 25 Status LocateElem(LinkList *L);
 26 Status ListInsert(LinkList *L);
 27 Status ListDelete(LinkList *L);
 28 void DestoryLinkList(LinkList **L);
 29 
 30 LinkList *InitList()//初始化结构体(生成带头结点的空链表) 
 31 {                                                //算法实现 
 32     LinkList *L;                             //Status InitList(LinkList *L) 
 33     L = (LinkList *)malloc(LEN);             //{ 
 34     if(L == NULL)                            //      L = new LNode;     //生成新结点作为头结点 
 35     {                                        //      L->next = NULL;    //头指针的指针域为空 
 36         printf("内存分配失败");           //      return OK; 
 37         exit(ERROR);                     //}
 38     }
 39     
 40     L->next = NULL;
 41     
 42     return L;
 43 }
 44 
 45 Status HeadInsert(LinkList *L)//头插法               //算法实现 
 46 {                                                    //void CreateList_Head(LinkList *L,int n) 
 47     LinkList *p;                                 //{
 48     int i;                                       //       L = newLnode;  
 49                                                      //       L->next = NULL;              
 50     printf("请输入数字<以86结束>:");              //       for(i = 0; i < n; i++)
 51     scanf("%d",&i);                              //       {  
 52     while(i != 86)                               //            p = new LNode;        //生成新结点*p 
 53     {                                            //            cin>>p->data;         //输入元素值赋给新生成的结点 
 54         p = (LinkList *)malloc(LEN);         //            p->next = L->next     //p的指针域指向头结点的下一个结点的数据域 
 55         p->data = i;           //输入数据     //            L->next = p;          //头结点的指针域指向p的数据域插入完成 
 56         p->next = L->next;                   //       }
 57         L->next = p;                         //}         
 58         scanf("%4d",&i);
 59     }
 60     return OK;
 61 }
 62 
 63 Status PrintList(LinkList *L)//打印 
 64 {
 65     LinkList *p;
 66     p = L->next;
 67     printf("操作结果是:");
 68     while(p != NULL)
 69     {
 70         printf("%5d",p->data);
 71         p = p->next;
 72     } 
 73     printf("\n");    
 74     return OK;
 75 }
 76 
 77 Status TailInsert(LinkList *L)                                    //算法描述 
 78 {                                                                   void CreatList_R(LinkList *L,int n)
 79     int i;                                                      { 
 80     LinkList *tail,*p;                                                L = new LNode;
 81     tail = L;  //尾指针的初值为头结点                                   L->next = NULL;
 82     printf("请输入正整数<以86结束>:");                                  r = L;  //尾指针r指向头结点 
 83     scanf("%d",&i);                                                   for(i = 0; i < n; i++)
 84                                                                       {
 85     while(i != 86)                                                         p = newLNode;
 86     {                                                                      cin>>p->data; 
 87         p = (LinkList *)malloc(LEN);                                   p->next = NULL;
 88         p->data = i;                                                   r->next = p; 
 89         tail->next = p; //新结点插入到表尾tail之后                       r = p;
 90         tail = p;       //将尾指针tail指向新插入的节点               }
 91         scanf("%d",&i);                                      }   
 92     }
 93     
 94     tail->next = NULL;
 95     return OK;
 96 }
 97 
 98 Status ListLength(LinkList *L)//测量长度 
 99 {
100     int i = 0;
101     LinkList *p;
102     
103     p = L->next;
104     while(p != NULL)
105     {
106         i++;
107         p = p->next;
108     }
109     printf("线性表的长度为:%d\n",i);
110     return i;
111 }
112 
113 Status GetElem(LinkList *L)//获取元素          //算法实现 
114 {                                              //Status GetElem(LinkList *L,int i,ElemType &e) 
115     int i = 0;                                 //{ 根据序号i获取元素的值 并用e返回 
116     int j;                                     //    p = L->next;
117     int temp = 0;                              //    while(p != NULL && j<i)
118     LinkList *p,*T;                            //    {
119     T = L->next;                               //        p = p->next; 
120     p = L->next;                               //        j++;
121     while(p != NULL)//测量一下线性表的长度           //    }
122     {                                              //    if(!p || j>i) return ERROR;
123         i++;                                       //    e = p->data;
124         p = p->next;                               //    return OK; 
125     }                                          //}
126     printf("请输入想要查找元素的位置:");
127     scanf("%d",&j);
128     if(j > i || i < 0)
129     printf("不好意思没那个位置\n");
130      
131     while(T != NULL)
132     {
133         temp++;
134         if(temp == j)
135         {
136             printf("第%d位置上的元素是:%d\n",j,T->data);
137             break;
138         }
139         T = T->next;
140     }
141     
142     return OK;
143 }
144 
145 Status LocateElem(LinkList *L)//定位,按值查找   //算法实现 
146 {                                               //LinkList *LocateElem(LinkList L,ElemType e) 
147     int i = 0,j,k = 0;                          //{        //寻找e元素 
148     LinkList *p;                                //         p = L->next;   //初始化p指向首元结点 
149                                                     //         while(p && p->data != e)   
150     p = L->next;                                //         { 
151     printf("请输入想要查找的数据:");             //                 p = p->next;   //扫描 
152     scanf("%d",&j);                             //         }
153     while(p != NULL)                            //         return p;             //返回e的结点地址p 
154     {                                           //}
155         i++;
156         if((p->data) == j)
157         {
158             printf("%d的位置是%d\n",j,i);
159             k = 1;
160             break;
161         }
162         
163         p = p->next;
164     }
165     if(k == 0)
166     {
167         printf("你查找的元素不存在啊!\n");
168     }
169     
170     return OK;
171 }
172 
173 Status ListInsert(LinkList *L)//插入                            //算法描述 
174 {                                                               //Status ListInsert(LinkList *L,int i,Elemtype e) 
175     int i,j,k = 0;                                              //{
176     LinkList *p,*q,*r;                                          //      p = L;
177                                                                 //      j = 0;
178     p = L->next;                                                //      while(p && (j<i-1))
179      printf("请输入插入的位置以及想要插入的数(无越界检查)");         //      { 
180     scanf("%d %d",&i,&j);                                       //           p = p->next;
181                                                                 //           j++;
182     q = (LinkList *)malloc(LEN);                                //      }    
183     q->data = j;                                                    //      if(!p || j>i-1)  return ERROR;
184     while(p != NULL)                                            //      s = new LNode;
185     {                                                           //      s->data = e;
186          if(i == 1) //如果插在头部的情况                       //      s->next = p->next;
187          {                                                   //      p->next = s;
188              q->next = L->next;                          //      return OK; 
189              L->next = q;                                //}
190              break;
191         }
192          else if((k+1) == i)//否则就往后找 
193          {
194              q->next = p->next;//数据的指针域指向p的下一个结点 
195              p->next = q;
196              break;
197         }
198          
199          p= p->next;
200      } 
201      
202      r = L->next;
203      printf("操作结果是:\n");
204      while(r != NULL)
205      {
206          printf("%5d",(r->data));
207          r = r->next;
208      }
209      printf("\n");
210      return OK;
211 }
212 
213 Status ListDelete(LinkList *L)                               //算法描述 
214 {                                                            //Status ListDelete(LinkList *L,Elemtype i) 
215     int i;                                                   //{ //带头结点的链表中删除第i个元素
216     LinkList *p,*q;                                          //     p =L;j = 0;   
217                                                                  //        while((p->next) && (j<i-1))
218     p = L->next;                                             //     {p = p->next; j++;}  //查找第i-1个结点 让p指向它
219     printf("请输入你想要删除的数组<相同的只删除一个>:");        //         if(!(p->next) || (j>i-1))  return ERROR;
220     scanf("%d",&i);                                          //          q = p->next;
221     while(p != NULL)                                         //          p->next = q->next;    
222     {                                                        //          delete q;
223         if(L->next->data == i)  //第一个数=               //          return OK;
224         {                                                  //  }
225             L->next = L->next->next;                
226             break;                                    
227         }
228         else if(p->next->data == i)
229         {
230             p->next = p->next->next;
231             break;
232         }
233         
234         p = p->next;
235     }
236     
237     q = L->next;
238     printf("操作结果是:");
239     while(q != NULL)
240     {
241         printf("%5d",(q->data));
242         q = q->next;
243     }
244     printf("\n");
245     return OK; 
246 } 
247 
248 void DestoryLinkList(LinkList **L)
249 {
250     LinkList *temp;
251     while(*L != NULL)
252     {
253         temp = *L;
254         *L = (*L)->next;
255         free(temp);
256     }
257 }
258 
259 Status main(void)             //主函数 
260 {
261     int i,j;
262     LinkList *L;
263     L = InitList();       //初始化单链表 
264     while(1)
265     {
266         printf("建立单链表:1.头插法  2.尾插法  3.结束\n");
267         printf("请输入操作序号");
268         scanf("%d",&i);
269         if(i == 1)
270         {
271             HeadInsert(L);
272             PrintList(L);
273             break;
274         }
275         else if(i == 2)
276         {
277             TailInsert(L);
278             PrintList(L);
279             break;
280         }     
281         else if(i == 3)
282         {
283             exit(0);         //代码正常退出  exit(1)为代码为非正常退出 
284         }
285         else
286         {
287             printf("输入有误,请重新输入\n"); 
288         }
289         
290     }
291     
292     printf("单链表操作:1.求长度 2.按位置求值 3.按值查找 4.插入 5.删除 6.退出\n");
293     while(1)
294     {
295         printf("请输入操作序号:");
296         scanf("%d",&j);
297         
298         if(j == 1)
299         {
300             ListLength(L);  //测量长度 
301         }
302         else if(j == 2)
303         {
304             GetElem(L);     //获取元素 
305         }
306         else if(j == 3)
307         {
308             LocateElem(L); //定位查找 
309         }
310         else if(j == 4)
311         {
312             ListInsert(L);  //插入 
313         } 
314         else if(j == 5)
315         {
316             ListDelete(L); //删除 
317         }
318         else if(j == 6)
319         {
320             exit(0);
321         }
322         else 
323         {
324             printf("数据输入有误\n"); 
325         }
326     }
327     
328     DestoryLinkList(&L);
329     
330     return 0;
331 }

 

posted @ 2020-03-14 11:32  Xxaj5  阅读(569)  评论(0编辑  收藏  举报