Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1220341
  • 博文数量: 106
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1098
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(106)

文章存档

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: LINUX

2018-12-09 17:26:16

单链表实例

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. typedef struct sksstats_task_node{
  3.     unsigned char taskId;
  4.     unsigned int data;
  5.     struct sksstats_task_node* next;
  6. }SKSSTATS_TASK_NODE;

  7. SKSSTATS_TASK_NODE* g_pTaskHead = NULL;

  8. SKSSTATS_TASK_NODE* SksStatsCreateTaskNode(unsigned char taskId)
  9. {
  10.     SKSSTATS_TASK_NODE* p = NULL;

  11.     p = (SKSSTATS_TASK_NODE*)malloc(sizeof(SKSSTATS_TASK_NODE));
  12.     if(NULL == p)
  13.     {
  14.         printf("have no memory for saving task!\n");
  15.         return NULL;
  16.     }
  17.     memset(p, 0, sizeof(SKSSTATS_TASK_NODE));

  18.     p->taskId = taskId;
  19.     p->next = NULL;

  20.     return p;
  21. }

  22. SKSSTATS_TASK_NODE* SksStatsFindTaskNode(SKSSTATS_TASK_NODE* pTaskHead, unsigned char taskId)
  23. {
  24.     if(pTaskHead == NULL)
  25.     {
  26.         return NULL;
  27.     }
  28.     if(pTaskHead->taskId == taskId)
  29.     {
  30.         return pTaskHead;
  31.     }

  32.     return SksStatsFindTaskNode(pTaskHead->next, taskId);
  33. }

  34. int SksStatsDeleteTaskNode(SKSSTATS_TASK_NODE** ppTaskNodeCur, SKSSTATS_TASK_NODE* pTaskNode)
  35. {
  36.     SKSSTATS_TASK_NODE* pTaskNodePre = NULL;
  37.     SKSSTATS_TASK_NODE* pTaskNodeTmp = NULL;

  38.     if(ppTaskNodeCur == NULL || *ppTaskNodeCur == NULL || pTaskNode == NULL)
  39.     {
  40.         return 1;
  41.     }

  42.     //删除头结点
  43.     if(*ppTaskNodeCur == pTaskNode)//也可以通过比较taskId
  44.     {
  45.         *ppTaskNodeCur = (*ppTaskNodeCur)->next;
  46.         free(pTaskNode);
  47.         return 0;
  48.     }

  49.     //删除头结点后的节点
  50.     pTaskNodePre = *ppTaskNodeCur;
  51.     while(pTaskNodePre->next != NULL)
  52.     {
  53.         pTaskNodeTmp = pTaskNodePre->next;
  54.         if(pTaskNodeTmp == pTaskNode)//也可以通过比较taskId
  55.         {
  56.             pTaskNodePre->next = pTaskNodeTmp->next;
  57.             free(pTaskNode);
  58.             return 0;
  59.         }
  60.         pTaskNodePre = pTaskNodePre->next;
  61.     }

  62.     return 2;
  63. }

  64. int SksStatsAddTaskNode(SKSSTATS_TASK_NODE** ppTaskNodeCur, SKSSTATS_TASK_NODE* pTaskNode)
  65. {
  66.     if(NULL == ppTaskNodeCur)
  67.     {
  68.         return 1;
  69.     }

  70.     if(NULL == *ppTaskNodeCur)
  71.     {
  72.         *ppTaskNodeCur = pTaskNode;
  73.         return 0;
  74.     }

  75.     return SksStatsAddTaskNode(&(*ppTaskNodeCur)->next, pTaskNode);
  76. }

  77. int main(int argc, char *argv[])
  78. {
  79.     unsigned char taskId = 0;
  80.     SKSSTATS_TASK_NODE* p = NULL;
  81.     SKSSTATS_TASK_NODE* d = NULL;

  82.     if(argc != 2)
  83.     {
  84.         printf("param error!\n");
  85.         return 1;
  86.     }
  87.     taskId = argv[1];
  88.     
  89.     /* 删除相同taskId的任务 */
  90.     d = SksStatsFindTaskNode(g_pTaskHead, taskId);
  91.     if(d != NULL)
  92.     {
  93.         if(SksStatsDeleteTaskNode(&g_pTaskHead, d) != 0)
  94.         {
  95.             printf("delete task failed!\n");
  96.         }
  97.     }

  98.     p = SksStatsCreateTaskNode(taskId);
  99.     if(p == NULL)
  100.     {
  101.         return 2;
  102.     }
  103.     /* 加入TaskNode链表 */
  104.     if(SksStatsAddTaskNode(&g_pTaskHead, p) != 0)
  105.     {
  106.         printf("add task failed!\n");
  107.         free(p);
  108.         return 3;
  109.     }

  110.     return 0;
  111. }

阅读(3398) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册