鱼C论坛

 找回密码
 立即注册
查看: 3315|回复: 1

跳表插入第5个数据时出错

[复制链接]
发表于 2021-8-5 14:18:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发在数据结构的板块比较合适
C写的跳表测试代码,但是只要插入第5个数据就会不正常退出,看了一天了,着实看不出哪里有问题,有好心大大帮我看看吗?
skiplist.h
  1. #include <stdio.h>
  2. typedef struct Node{
  3.     int key;
  4.     int value;
  5.     int max_level;
  6.     struct Node* next[0];
  7. }Node;

  8. typedef struct SkipList{
  9.     int count;
  10.     int level;
  11.     struct Node* head;
  12. }SkipList;
复制代码


main.c
  1. #include <stdio.h>
  2. #include "./skiplist.h"
  3. #include<stdlib.h>
  4. #include<string.h>

  5. Node* CreateNode(int key, int value, int level)
  6. {
  7.     printf("key:%d,value:%d\n", key, value);
  8.     Node* tmp = (Node*)malloc(sizeof(Node) + sizeof(Node*)*level);
  9.     memset(tmp, 0, sizeof(Node) + sizeof(Node*)*level);
  10.     tmp->key = key;
  11.     tmp->value = value;
  12.     tmp->max_level = level;
  13.     return tmp;
  14. }

  15. SkipList* CreateSkipList(int max_level)
  16. {
  17.     printf("创建表头\n");
  18.     SkipList* list = (SkipList*)malloc(sizeof(SkipList));
  19.     list->level = 1;
  20.     list->count = 0;
  21.     list->head = CreateNode(0, 0, max_level);
  22.     if(list->head == NULL)
  23.     {
  24.         printf("表头为空\n");
  25.         free(list);
  26.         return NULL;
  27.     }
  28.     printf("表头创建完毕\n");
  29.     return list;
  30. }

  31. int SkipListLevel(SkipList * list)
  32. {
  33.         int i = 0;
  34.         int level = 1;
  35.         for (i = 1; i < list->head->max_level; i++)
  36.         {
  37.                 if ((rand()%2) == 1)
  38.                 {
  39.                         level++;
  40.                 }
  41.         }

  42.         return level;
  43. }

  44. void Insert(SkipList* list, int key, int value)
  45. {
  46.     printf("开始插入key:%d\n", key);
  47.     printf("max_level:%d\n", list->head->max_level);
  48.     Node** update = (Node**)malloc(sizeof(Node*)*list->head->max_level);
  49.     Node* prev = list->head;
  50.     Node* tmp = (Node*)malloc(sizeof(Node*));

  51.     int i = 0;
  52.     for(i = list->level - 1;i >= 0;i--)
  53.     {
  54.         while(((tmp = prev->next[i]) != NULL) && (tmp->key < key))
  55.         {
  56.             prev = tmp;
  57.         }
  58.         update[i] = prev;
  59.     }

  60.     if((tmp != NULL) && (tmp->key == key))
  61.     {
  62.         printf("%d已经存在\n");
  63.         return;
  64.     }

  65.     int max_level = SkipListLevel(list);

  66.     Node* newNode = CreateNode(key, value, max_level);
  67.     printf("创建了一个节点key:%d,value:%d\n", newNode->key, newNode->value);
  68.     if(max_level > list->level)
  69.     {
  70.         for(i = list->level;i < max_level;i++)
  71.         {
  72.             update[i] = list->head;
  73.         }
  74.         list->level = max_level;
  75.     }

  76.     for(i = 0;i < list->level;i++)
  77.     {
  78.         newNode->next[i] = update[i]->next[i];
  79.         update[i]->next[i] = newNode;
  80.     }

  81.     list->count ++;
  82. }


  83. void PrintSkipList(SkipList* list)
  84. {
  85.     Node* prev = list->head;
  86.     int i = 0;
  87.     for(i = list->level - 1;i >= 0;i--)
  88.     {
  89.         prev = list->head;
  90.         printf("level[%d]:", i);
  91.         while(prev->next[i] != NULL)
  92.         {
  93.             printf("%d-%d ", prev->next[i]->key, prev->next[i]->value);
  94.             prev = prev->next[i];
  95.         }
  96.         printf("\n");
  97.     }
  98.     printf("\n");
  99. }

  100. int main()
  101. {
  102.     SkipList* list = CreateSkipList(5);

  103.     Insert(list, 1, 1);
  104.     Insert(list, 2, 2);
  105.     Insert(list, 3, 3);
  106.     Insert(list, 4, 4);
  107. //    Insert(list, 5, 5);
  108.     PrintSkipList(list);
  109.     return 0;
  110. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-5 16:33:50 | 显示全部楼层
找到问题了
  1. for(i = 0;i < list->level;i++)
  2.     {
  3.         newNode->next[i] = update[i]->next[i];
  4.         update[i]->next[i] = newNode;
  5.     }
复制代码

换成
  1.     for(i = 0;i < max_level;i++)
  2.     {
  3.         newNode->next[i] = update[i]->next[i];
  4.         update[i]->next[i] = newNode;
  5.     }
复制代码

这里如果下次插入节点的层级比上次的小,会访问到没有值的update[i]->next[i]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 15:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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