搜索
查看: 264|回复: 0
打印 上一主题 下一主题

哦哦哦

[复制链接]
跳转到指定楼层
楼主
 楼主| 发表于 2020-11-6 23:41:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <malloc.h>

  4. #define false 0
  5. #define true 1
  6. typedef struct Node
  7. {
  8.   int data; //数据域
  9.   struct Node * pNext; //指针域
  10. }NODE, *PNODE;
  11. //创建一个链表
  12. PNODE create_list(void)
  13. {
  14.   int len;  //用来存放有效节点的个数
  15.   int i;
  16.   int val; //用来临时存放用户输入的结点的值

  17.   PNODE pHead = (PNODE)malloc(sizeof(NODE));
  18.   if (NULL == pHead)
  19.   {
  20.     printf("分配失败, 程序终止!");
  21.     exit(-1);
  22.   }
  23.   PNODE pTail = pHead;
  24.   pTail->pNext = NULL;

  25.   printf("请输入您需要生成的链表节点的个数: len = ");
  26.   scanf("%d", &len);

  27.   for (i=0; i<len; ++i)
  28.   {
  29.     printf("请输入第%d个节点的值: ", i+1);
  30.     scanf("%d", &val);

  31.     PNODE pNew = (PNODE)malloc(sizeof(NODE));
  32.     if (NULL == pNew)
  33.     {
  34.       printf("分配失败, 程序终止!");
  35.       exit(-1);
  36.     }
  37.     pNew->data = val;
  38.     pTail->pNext = pNew;
  39.     pNew->pNext = NULL;
  40.     pTail = pNew;
  41.   }

  42.   return pHead;
  43. }
  44. //遍历链表
  45. void traverse_list(PNODE pHead)
  46. {
  47.   printf("遍历所得链表为:");
  48.   PNODE p=pHead->pNext;
  49.   while(NULL!=p)
  50.   {
  51.     printf("%d  ",p->data);
  52.     p=p->pNext;
  53.   }
  54.   printf("");
  55. }
  56. //求链表长度
  57. int length_list(PNODE pHead)
  58. {

  59.   int len=0;
  60.   PNODE p=pHead;
  61.   while(p->pNext!=NULL)
  62.   {
  63.     len++;
  64.     p=p->pNext;
  65.   }
  66.   printf("现在的链表长度为:%d",len);
  67.   return len ;

  68. }
  69. //插入一个结点
  70. void insert_list(PNODE pHead)
  71. {
  72.   int pos ;
  73.   int val;
  74.   int i = 0;
  75.     printf("请选择在第几个节点插入");
  76.     scanf("%d",&pos);
  77.     printf("请输入所插入节点的值:");
  78.     scanf("%d",&val);
  79.   PNODE p = pHead;
  80.   while (NULL!=p && i<pos-1)
  81.   {
  82.     p = p->pNext;
  83.     ++i;
  84.   }
  85.   if (i>pos-1 || NULL==p)
  86.     return false;

  87.   PNODE pNew = (PNODE)malloc(sizeof(NODE));
  88.   if (NULL == pNew)
  89.   {
  90.     printf("动态分配内存失败!");
  91.     exit(-1);
  92.   }
  93.   pNew->data = val;
  94.   PNODE q = p->pNext;
  95.   p->pNext = pNew;
  96.   pNew->pNext = q;

  97.   return true;
  98. }
  99. //删除一个结点
  100. Bool delete_list(PNODE pHead, int pos, int * pVal)
  101. {
  102.   int i = 0;
  103.   PNODE p = pHead;

  104.   while (NULL!=p->pNext && i<pos-1)
  105.   {
  106.     p = p->pNext;
  107.     ++i;
  108.   }

  109.   if (i>pos-1 || NULL==p->pNext)
  110.     return false;

  111.   PNODE q = p->pNext;
  112.   *pVal = q->data;

  113.   //删除p节点后面的结点
  114.   p->pNext = p->pNext->pNext;
  115.   free(q);
  116.   q = NULL;

  117.   return true;

  118. }
  119. //根据指定的位序查找
  120. void Find_elem_byloc (PNODE pHead)
  121. {
  122.     int cnt = 1;//位序从1开始
  123.     int pos ;
  124.     printf("请输入你要按序号查找的数的序号:");
  125.   scanf("%d",&pos );

  126.   PNODE pnode = pHead->pNext ;
  127.   while
  128.   (pnode && cnt < pos)
  129.     {
  130.     pnode = pnode -> pNext;
  131.     cnt++;
  132.   }
  133.   if((cnt==pos)&&pnode)
  134.   printf("您查找的数为:%d",pnode->data);
  135.   else printf("您查找数不存在");
  136. }

  137. //按值查找
  138. void Find_elem_bypri (PNODE pHead)
  139. {
  140.     int i ;
  141.     printf("请输入您要查找的值");
  142.     scanf("%d" , &i );
  143.   PNODE pnode  = pHead->pNext;
  144.   while(pnode && pnode ->data!=i ){
  145.     pnode = pnode -> pNext;
  146.   }
  147.   if(pnode)
  148.     printf("查找成功,您查找的数为:%d",pnode->data);
  149.   else
  150.   printf("您查找数不存在");
  151. }
  152. //链表冒泡排序
  153. PNODE ListSort(PNODE pHead)
  154. {
  155.     PNODE p,q,tail ,h;
  156.     tail = NULL;
  157.     h = pHead;
  158.     while(h->pNext!=tail)
  159.     {
  160.         p =pHead;
  161.         q = p->pNext;
  162.         while(q->pNext!=tail)
  163.         {
  164.             if(p->pNext->data > q->pNext->data)
  165.             {
  166.                 p->pNext = q->pNext;
  167.                 q->pNext = q->pNext->pNext;
  168.                 p->pNext->pNext = q;
  169.                 p = p->pNext;
  170.             }
  171.             else
  172.             {
  173.                 p = p->pNext;
  174.                 q = q->pNext;
  175.             }
  176.         }
  177.         tail = q; //前移一位
  178.     }
  179.     return pHead;
  180. }
  181. //创建另一个链表
  182. PNODE create_list_sec(void)
  183. {
  184.   int len;  //用来存放有效节点的个数
  185.   int i;
  186.   int val; //用来临时存放用户输入的结点的值

  187.   PNODE pHeadt = (PNODE)malloc(sizeof(NODE));
  188.   if (NULL == pHeadt)
  189.   {
  190.     printf("分配失败, 程序终止!");
  191.     exit(-1);
  192.   }
  193.   PNODE pTail = pHeadt;
  194.   pTail->pNext = NULL;

  195.   printf("请输入您需要生成的链表节点的个数: len = ");
  196.   scanf("%d", &len);

  197.   for (i=0; i<len; ++i)
  198.   {
  199.     printf("请输入第%d个节点的值: ", i+1);
  200.     scanf("%d", &val);

  201.     PNODE pNew = (PNODE)malloc(sizeof(NODE));
  202.     if (NULL == pNew)
  203.     {
  204.       printf("分配失败, 程序终止!");
  205.       exit(-1);
  206.     }
  207.     pNew->data = val;
  208.     pTail->pNext = pNew;
  209.     pNew->pNext = NULL;
  210.     pTail = pNew;
  211.   }

  212.   return pHeadt;
  213. }
  214. //合并两个链表
  215. PNODE Merge_LinkList(PNODE pHead , PNODE pHeadt,PNODE pHeadm)
  216. {

  217.     PNODE Lc,La,Lb,pa,pb,pc,ptr;
  218.     La = pHead;
  219.     Lb = pHeadt;
  220.     Lc = pHeadm;
  221.     pa=La->pNext ;
  222.     pb=Lb->pNext ;
  223.     while (pa&&pb)
  224.         {
  225.             if  (pa->data<=pb->data) {
  226.             pc->pNext=pa ;  pc=pa ;   pa=pa->pNext  ;
  227.         }
  228.             else {pc->pNext = pb; pc = pb; pb = pb->pNext;}

  229.         }
  230.     pc->pNext=pa ? pa :pb ;
  231.     free(Lb) ;
  232.     return(Lc) ;
  233. }

  234. void ShowMenu()//显示菜单
  235. {
  236.   int i;
  237.   int WIDESIZE = 65;
  238.   printf("");
  239.   printf("------------------------");
  240.   printf("        欢迎使用线性表的链式表示和实现        ");
  241.   printf("------------------------");
  242.   printf("                ");
  243.   for(i=0;i<WIDESIZE;i++)
  244.   {
  245.     printf("*");
  246.   }
  247.   printf("");
  248.   printf("                *        1.系统帮助及说明        **");
  249.   printf("        2.创建一个链表                *");
  250.   printf("                *        3.求链表的长度                ");
  251.   printf("**        4.插入一个结点                *");
  252.   printf("                *        5.删除一个结点                **");
  253.   printf("        6.按成位序找结点信息        *");
  254.   printf("                *        7.按值查找结点信息        **");
  255.   printf("        8.排序第一个链表        *");
  256.   printf("                *        9.创造第二个链表        **");
  257.   printf("        10.排序第二个链表        *");
  258.                 printf("                *        11.遍历第一个链表        **");
  259.   printf("        12.退出该系统                *");
  260.                 printf("                *        13.合并两个链表        **");
  261.   for(i=0;i<4;i++)
  262.   {
  263.     printf("        ");
  264.   }
  265.   printf("                ");
  266.   for(i=0;i<WIDESIZE;i++)
  267.   {
  268.     printf("*");
  269.   }
  270.   printf("");
  271.   printf("--------------------------------");
  272.   printf("   2019级电科一班王岸基作品   ");
  273.   printf("----------------------------------");
  274.   printf("请按所需输入菜单编号:");
  275. }
  276. void ShowHelp()//显示帮助信息
  277. {
  278.   printf("1、此系统可以实现线性表的链式表示和实现");
  279.   printf("2、输入对应功能项的编号即可进行不同功能的操作。");
  280. }
  281. int main(void)
  282. {
  283.     PNODE pHead = NULL;
  284.     PNODE pHeadt = NULL ;
  285.     PNODE pHeadm = NULL ;
  286.     int pos ;
  287.     int val ;
  288.     int len ;
  289.   int flag = -1;
  290.   int choice;
  291.   while(flag!=12)
  292.   {
  293.     ShowMenu();
  294.     scanf("%d",&choice);
  295.     switch (choice)
  296.     {
  297.       case 1:
  298.         ShowHelp();break;
  299.       case 2:
  300.         pHead = create_list();
  301.                 printf("创造的链表");
  302.                 traverse_list(pHead);break;
  303.       case 3:
  304.         len=length_list(pHead);break;
  305.       case 4:
  306.         insert_list(pHead);
  307.                 printf("插入后");
  308.                 traverse_list(pHead);;break;
  309.       case 5:
  310.                 printf("请选择在第几个节点删除");
  311.                 scanf("%d",&pos);
  312.                 if(delete_list(pHead,pos,&val))
  313.                 {
  314.                     printf("删除成功,您所删除的元素是:%d",val);
  315.                 }
  316.                 else
  317.                 {
  318.                     printf("删除失败!您所删除的元素不存在!");
  319.                 }
  320.                 printf("删除后");
  321.                 traverse_list(pHead);break;
  322.       case 6:
  323.                 Find_elem_byloc(pHead); break;
  324.       case 7:
  325.         Find_elem_bypri(pHead);break;
  326.       case 8:
  327.                 pHead = ListSort(pHead);
  328.                 printf("排序后");
  329.                 traverse_list(pHead);break;
  330.       case 9:
  331.                 pHeadt = create_list_sec();
  332.                 printf("创造的另一个链表");
  333.                 traverse_list(pHeadt);break;
  334.             case 10:
  335.         pHeadt = ListSort(pHeadt);
  336.                 printf("排序后第二个链表");
  337.                 traverse_list(pHeadt);break;
  338.             case 11:
  339.                 traverse_list(pHead);break;
  340.             case 13:
  341.                 traverse_list(Merge_LinkList(pHead,pHeadt,pHeadm ));
  342.       case 12:
  343.         flag = 12;break;
  344.     }
  345.   }
  346.   return 0;
  347. }


复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表