鱼C论坛

 找回密码
 立即注册
查看: 5237|回复: 4

[已解决]C清空链表,异常中断“读取访问权限冲突”

[复制链接]
发表于 2019-5-30 20:02:32 | 显示全部楼层 |阅读模式

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

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

x
void Clear(LinkList* list2)                        //清空链表
{
        Node* node = list2->next;
        Node* nextNode;
        while (node) {                                //当node不为空
                nextNode = node->next;        //先记录当前节点的下个结点,以便释放当前结点内存。
                free(node);
                node = nextNode;
        }
        list2->next = NULL;
        list2->length = 0;
}

这是一段清空链表的C语言代码,

VS运行时中断报错如下:

“引发了异常: 读取访问权限冲突。
node 是 0xFFFFFFFFFFFFFFEF。”

请问这个问题出在哪里,要如何改正呢??
最佳答案
2019-5-31 16:34:53
  1. void test()
  2. {
  3.         LinkList list2;
  4.         list2.length = 0;
  5.         list2.next=NULL; //<<加上
  6.         InitLinkList(&list2,dataArray,4);
  7.         //Print(&list2);
  8.         
  9.         Clear(&list2);
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-30 20:24:02 | 显示全部楼层
贴完整代码,这一段看不出来问题,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 11:32:24 | 显示全部楼层
本帖最后由 菜鸟小乔 于 2019-5-31 12:39 编辑
Croper 发表于 2019-5-30 20:24
贴完整代码,这一段看不出来问题,


调用其他函数都没问题,就只有调用清空链表函数clear()时有“访问权限冲突”问题。
【.h文件】----定义数据类型,声明函数。
  1. #ifndef linklist_h_include
  2. #define linklist_h_include
  3. #include<stdio.h>
  4. #include<stdlib.h>

  5. #define MAX_SIZE 255
  6. #define  TRUE 1
  7. #define  FALSE 0
  8. //定义一种数据类型
  9. typedef struct {
  10.         int id;
  11.         char* name;
  12. }EleType;

  13. //定义链表节点,包含数据域和指针域
  14. typedef struct Node {
  15.         EleType data;        //数据域
  16.         struct Node* next;        //指针域,指向下个结点
  17. }Node;

  18. //定义 头结点LinkList
  19. //定义链表时示,习惯性定义头结点,以便统一链表节点的插入和删除操作;
  20. //头结点也可以称为首元结点,最后一个结点叫做尾元结点。
  21. typedef struct LinkList {
  22.         Node* next;        //头指针(有头节点,)
  23.         int length;        //链表长度,初始值为0.
  24. }LinkList;

  25. //初始化
  26. void InitLinkList(LinkList* list2, EleType* dataArray, int len);
  27. //插入元素
  28. void Insert(LinkList* list2, int pos, EleType element);

  29. void Print(LinkList* list2);

  30. int IsLinkListEmpty(LinkList*list2);

  31. EleType GetLinkListElement(LinkList* list2, int pos);//查找

  32. EleType DeleteElement(LinkList* list2, int pos);//删除并返回指定位置的节点

  33. void Clear(LinkList*list2);//删除单链表整表,释放内存
  34. #endif
复制代码

-----------------------------------函数实现------------------------------------------------------------
【.C文件】
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. #include"LinkList.h"
  5. ///初始化链表////////////////////////////////////////////
  6. void InitLinkList(LinkList* list2, EleType* dataArray, int len)
  7. {
  8.         for (int i = 0; i < len; i++)
  9.         {
  10.                 Insert(list2, i + 1, dataArray[i]);
  11.         }
  12. }
  13. //在pos位置插入元素element//////////////////////////////
  14. void Insert(LinkList* list2, int pos, EleType element)
  15. {
  16.         if (pos<1 || pos>list2->length+1)
  17.         {
  18.                 printf("错误的下标,插入失败!\n");
  19.                 return;
  20.         }
  21.         //step1:创建空结点,并为数据域赋值;即创建一个用来插入的节点node
  22.         Node* node = (Node*)malloc(sizeof(Node));
  23.         node->data = element;
  24.         node->next = NULL;
  25.         //step2:找到要插入的位置的节点;
  26.         if (pos == 1)//插入的是第一个元素
  27.         {
  28.                 node->next = list2->next;//给插入节点的后继赋值,
  29.                 list2->next = node;//让头节点的next指向插入的这个结点;
  30.                 list2->length++;
  31.                 printf("if pos==1\n");
  32.                 return;
  33.         }
  34.         //不是第一个位置,通过循环找到要插入的节点。
  35.         Node* currNode = list2->next;//cuurNode成为第一个节点
  36.         for (int i = 1; currNode && i < pos - 1;i++)//currNode不为空且
  37.         {
  38.                 //目标:循环到currNode->next指向要插入的元素pos位置,
  39.                 //currNode就是pos-1的位置,currNode一开始被赋予第一个元素的值,循环到pos-1的位置,循环次数为pos-2。所以条件为i<pos-1
  40.                 currNode = currNode->next;//currNode成为下一个节点
  41.         }
  42.         //step3:将结点插入并对接前面的节点
  43.         if (currNode)//currNode不为空
  44.         {
  45.                 node->next = currNode->next;//当前结点的next 赋给 插入的结点的next;(与后面连接)
  46.                 currNode->next = node;//当前结点的next指向插入的元素(与前面连接)
  47.                 list2->length++;
  48.         }       
  49. }
  50. ////////////////////////////////
  51. int IsLinkListEmpty(LinkList* list2)
  52. {
  53.         return list2 == 0 ? TRUE : FALSE;
  54. }
  55. ///////////////////////////////
  56. EleType GetLinkListElement(LinkList* list2, int pos)//查找
  57. {
  58.         Node*node = list2->next;
  59.         for (int i = 1; node && i < pos; i++)
  60.         {
  61.                 node = node->next;
  62.         }
  63.         return node->data;
  64. }
  65. ///////////////////////////////
  66. EleType DeleteElement(LinkList* list2, int pos) //删除并返回指定位置的节点
  67. {
  68.         EleType element;                //被删除的元素
  69.         element.id = -999;        //附一个不可能的值,用来判断是否删除成功
  70.         if (pos<1 || pos>list2->length)
  71.         {
  72.                 printf("错误的下标,删除失败!\n");
  73.                 return;
  74.         }
  75.         Node* node;
  76.         if (pos == 1)//删除第一个节点
  77.         {
  78.                 node = list2->next;//把第一个结点赋给node
  79.                 if (node)
  80.                 {
  81.                         element = node->data;
  82.                         list2->next = node->next;
  83.                         free(node);//释放被删除节点的内存
  84.                         list2->length--;
  85.                 }
  86.                 return element;
  87.         }
  88.         //1、找到要删除的节点和他的前缀节点
  89.         //2、要删除节点的next复制个前缀的next
  90.         //3、释放
  91.         Node* pre_node=NULL;//前缀节点
  92.         node = list2->next;
  93.         for (int i = 1; node && i < pos ; i++)
  94.         {
  95.                 pre_node = node;//前缀结点
  96.                 node = node->next;//当前结点
  97.         }
  98.         if (node)
  99.         {
  100.                 element = node->data;
  101.                 pre_node->next = node->next;
  102.                 free(node);
  103.                 list2->length--;
  104.         }
  105. }
  106. /////////////////////////////////////////
  107. void Clear(LinkList* list2)//清空链表
  108. {
  109.         Node* node = list2->next;
  110.         Node* nextNode;
  111.         while (node) {        //当node不为空
  112.                 nextNode = node->next;//先记录当前节点的下个结点,以便释放当前结点内存。///VS中断报错指向这一行
  113.                 free(node);
  114.                 node = nextNode;
  115.         }
  116.         list2->next = NULL;
  117.         list2->length = 0;
  118. }
  119. ///////////////////////////////////////////
  120. void Print(LinkList* list2)//打印函数
  121. {
  122.         Node* node = list2->next;
  123.         if (!node)
  124.         {
  125.                 printf( "链表为空!\n");
  126.                 list2->length= 0;
  127.         }
  128.         for (int i = 0; i<list2->length;i++)
  129.         {
  130.                 printf("%d\t%s\n", node->data.id, node->data.name);
  131.                 node = node->next;
  132.         }
  133.         printf("**************\n");
  134. }
复制代码

-----------------------main函数-------------------------
  1. #include<malloc.h>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include"Linklist.h"

  6. //测试数据
  7. EleType dataArray[] = {
  8.         {1,"潇湘妃子"},
  9.         {2,"怡红公子"},
  10.         {3,"蘅 芜 君"},
  11.         {4,"稻香老农"}
  12. };

  13. void test();
  14. /////////////////////
  15. int main()
  16. {
  17.         test();
  18.         return 0;
  19. }
  20. ////////////////////
  21. void test()
  22. {
  23.         LinkList list2;
  24.         list2.length = 0;//容易忽略的地方,初始化时长度值为零
  25.         InitLinkList(&list2,dataArray,4);
  26.         //Print(&list2);
  27.        
  28.         Clear(&list2);
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-31 16:34:53 | 显示全部楼层    本楼为最佳答案   
  1. void test()
  2. {
  3.         LinkList list2;
  4.         list2.length = 0;
  5.         list2.next=NULL; //<<加上
  6.         InitLinkList(&list2,dataArray,4);
  7.         //Print(&list2);
  8.         
  9.         Clear(&list2);
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-31 17:02:47 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-13 18:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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