控制台测试链表程序-C语言指针练习的好例子

[复制链接]
查看180 | 回复0 | 2021-11-15 14:57:01 | 显示全部楼层 |阅读模式
1.png

  1. #include "stdio.h"
  2. #include "malloc.h"

  3. typedef struct node {
  4.     int data;
  5.     node* next;
  6. }Node;

  7. typedef struct {
  8.         unsigned char id;
  9.         void(*Func)(Node **head);
  10. }FuncSt;

  11. Node* uartListHead = NULL;

  12. int ListCreat(Node **p_list, int size)
  13. {
  14.     node* p = NULL;
  15.     int i;
  16.     *p_list = (Node*)malloc(sizeof(Node));
  17.     if (*p_list == NULL)
  18.     {
  19.         return 0;
  20.     }
  21.     (*p_list)->next = NULL;
  22.     for (i = size; i > 0; i--)
  23.     {
  24.         p = (Node*)malloc(sizeof(Node));
  25.         if (p == NULL)
  26.         {
  27.             return 0;
  28.         }
  29.         p->data = i;
  30.         p->next =(*p_list)->next;
  31.         (*p_list)->next = p;
  32.     }
  33.     return 1;
  34. }

  35. void ScanPrintList(Node **head)
  36. {
  37.         Node *p;
  38.         Node *q;
  39.         p = (*head)->next;
  40.         printf("\n\n链表遍历结果如下:\n");
  41.         if (p == NULL)
  42.         {
  43.                 printf("空链表\n");
  44.         }
  45.         while(p != NULL)
  46.         {
  47.                 printf("%d\t",p->data);
  48.                 q = p->next;
  49.                 p = q;
  50.         }
  51.         printf("\n\n");
  52. }
  53. void ListGetDat(Node **head, int dat)
  54. {
  55.         
  56.         Node* tempPtr = (Node*)malloc(sizeof(Node));
  57.         Node *p = NULL;
  58.         int count = 0;
  59.         int flag = 0;
  60.         if (tempPtr == NULL)
  61.         {
  62.                 return;
  63.         }
  64.         if ((*head)->next == NULL)
  65.         {
  66.                 printf("未查到该元素");
  67.                 return;
  68.         }
  69.         p = *head;
  70.         while(p != NULL)
  71.         {
  72.                 if (p->data == dat)
  73.                 {
  74.                         printf("第%d个元素是%d\n",count,dat);
  75.                         flag = 1;
  76.                 }
  77.                 p = p->next;
  78.                 count++;
  79.         }
  80.         if (flag == 0)
  81.         {
  82.                 printf("未查到该元素\n");
  83.         }
  84. }

  85. void ListRemoveDat(Node **head, int dat)
  86. {
  87.         
  88.         Node *p = NULL;
  89.         Node *q = NULL;
  90.         int count = 0;
  91.         int flag = 0;

  92.         if ((*head)->next == NULL)
  93.         {
  94.                 printf("未查到该元素 无法删除");
  95.                 return;
  96.         }
  97.         p = *head;
  98.         q = p;
  99.         while(p != NULL)
  100.         {
  101.                 if (p->data == dat)
  102.                 {
  103.                         printf("第%d个元素是%d 已删除\n",count,dat);
  104.                         flag = 1;
  105.                         q->next = p->next;
  106.                         free(p);
  107.                         p = q;
  108.                 }
  109.                 q = p;
  110.                 p = p->next;
  111.                 count++;
  112.         }
  113.         if (flag == 0)
  114.         {
  115.                 printf("未查到该元素 无法删除\n");
  116.         }
  117. }
  118. void ListRemoveDatTest(Node **head)
  119. {
  120.     int temp;
  121.         printf("remove input:\n");
  122.         scanf("%d",&temp);
  123.         ListRemoveDat(head, temp);
  124. }

  125. void ListGetDatTest(Node **head)
  126. {
  127.     int temp;
  128.         printf("aim input:\n");
  129.         scanf("%d",&temp);
  130.         ListGetDat(head, temp);
  131. }
  132. void ListTailAdd(Node **head, int dat)
  133. {
  134.         
  135.         Node* tempPtr = (Node*)malloc(sizeof(Node));
  136.         Node *p = NULL;
  137.         if (tempPtr == NULL)
  138.         {
  139.                 return;
  140.         }
  141.         if ((*head)->next == NULL)
  142.         {
  143.                 (*head)->next = tempPtr;
  144.                 tempPtr->data = dat;
  145.                 tempPtr->next = NULL;
  146.                 return;
  147.         }
  148.         p = *head;
  149.         while(p->next != NULL)
  150.         {
  151.                 p = p->next;
  152.         }
  153.         p->next = tempPtr;
  154.         tempPtr->data = dat;
  155.         tempPtr->next = NULL;
  156. }

  157. void TailAddTest(Node **head)
  158. {
  159.         int temp;
  160.         printf("value input:\n");
  161.         scanf("%d",&temp);
  162.         ListTailAdd(head, temp);
  163. }

  164. void ListClean(Node **head)
  165. {
  166.         Node *p = NULL;
  167.         while((*head)->next != NULL)
  168.         {
  169.                 p = (*head)->next;
  170.                 (*head)->next = p->next;
  171.                 free(p);
  172.         }
  173. }

  174. FuncSt g_funcTable[] = {
  175.         {1, ListClean},
  176.         {2, TailAddTest},
  177.         {3,        ListGetDatTest},
  178.         {4,        ScanPrintList},
  179.         {5, ListRemoveDatTest},
  180. };

  181. void FnucHandleTask(unsigned char id)
  182. {
  183.         for (int i = 0; i < (sizeof(g_funcTable) / sizeof(g_funcTable[0])); i++)
  184.         {
  185.                 if (id == g_funcTable[i].id)
  186.                 {
  187.                         g_funcTable[i].Func(&uartListHead);
  188.                         break;
  189.                 }
  190.         }
  191. }
  192. void InitPrnt(void)
  193. {
  194.         printf("1:链表清空\t2:尾部添加元素\t3:查找指定元素\t4:遍历链表\t5:删除指定元素\t6:指定位置数据更改\t\n");        
  195. }
  196. int main()
  197. {
  198.         unsigned char testCategory;
  199.         if (ListCreat(&uartListHead, 10) == 1)
  200.         {
  201.                 printf("list creat succes!\n");
  202.         }
  203.         while(1)
  204.         {
  205.                 InitPrnt();
  206.                 scanf("%d",&testCategory);
  207.                 FnucHandleTask(testCategory);
  208.         }
  209.         return 1;
  210. }
复制代码


回复

使用道具 举报

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

本版积分规则