找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1679|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主


C语言源程序:
  1. /* mcu6666 */
  2. #include "stdio.h"
  3. #include "malloc.h"

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

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

  12. Node* uartListHead = NULL;

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

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

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

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

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

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

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

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

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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表