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


      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 }
  • 相关阅读:
    【转载】比较c++中的值传递,引用传递,指针传递
    【转载】在ARX中通过COM在ACAD中添加菜单和工具条
    【转载】预编译头文件phc
    jsp 连 sql server
    今天上传点关于asp的好东东
    转: [软件人生]给一个刚毕业学生朋友的建议
    世界首富比尔盖茨花钱全过程
    wap开发工具
    一名25岁的董事长给大学生的18条忠告
    今天再来点好东东,
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491184.html
Copyright © 2020-2023  润新知