数据结构小白 2022-10-26 09:56 采纳率: 50%
浏览 95
已结题

c语言链表,用vs2022报错 ,什么原因

用vs2022编译直接报错,出错的原因是读取访问权限冲突,但是删除那加上break后只删除一个目标就不会报错,删掉break就不能运行,求帮助
代码是这样的#include <stdio.h>
#include <stdlib.h> //带头结点单链表
typedef struct Node { //定义链表数据结构
int data;
struct Node* next;
}Node;

Node* initList(){ //初始化 头结点
Node* List = (Node*)malloc(sizeof(Node));//开辟空间后List变成结构体变量
List->data = 0;//头结点不存储数据但可以计数,保存链表元素个数
List->next = NULL;
return List;
}

void headInsert(NodeList,int data) {//头插法
Node
node = (Node*)malloc(sizeof(Node));//新建的一个结点;
node->data = data;
node->next = List->next;
List->next = node;
List->data++;//头结点开始计数
}

void tailInsert(NodeList,int data) {//尾插法
Node
head = List;//后面头结点会改变,先保存下来
Node* node = (Node*)malloc(sizeof(Node));//新建的一个结点;
node->data = data;
node->next = NULL;
List = List->next;//指向第一个保存数据的结点,开始遍历找最后一个结点
while (List->next != NULL) {
List = List->next;
}//遍历结束找到头结点
List->next = node;//让最后一个结点指向新结点
head->data++;//头结点计数
}

void deleteNode(NodeList,int data){//删除结点,输入想删除的数data
Node
pre = List;//后面会改变头结点先找个替身pre
Node* current = List->next;//设第一个保存数据的结点为当前结点current
while (current != NULL) {//遍历查找想要删除的数据data所在的结点
if (current->data == data) {
pre->next = current->next;
free(current);
//break;
}
pre = current;
current = current->next;
}
List->data--;
}

void printList(Node* List) {//遍历带头结点的单链表
List = List->next;//指向第一个保存数据的结点,开始遍历
while (List != NULL) {
printf("%d ", List->data);
List = List->next;
}
printf("\n");
}

int main() {
Node* List = initList();//创建头结点
headInsert(List, 1);
headInsert(List, 2);
headInsert(List, 3);
headInsert(List, 3);
headInsert(List, 3);
tailInsert(List, 4);
tailInsert(List, 5);
tailInsert(List, 6);
printList(List);
deleteNode(List, 3);
printList(List);
return 0;
}

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-10-26 12:12
    关注

    没什么问题,void deleteNode(Node *List, int data) 函数里做了修改,见注释,供参考:

    #include <stdio.h>
    #include <stdlib.h> //带头结点单链表
    typedef struct _Node { //定义链表数据结构
        int    data;
        struct _Node* next;
    }Node;
    
    Node* initList() { //初始化 头结点
        Node* List = (Node*)malloc(sizeof(Node));//开辟空间后List变成结构体变量
        List->data = 0;//头结点不存储数据但可以计数,保存链表元素个数
        List->next = NULL;
        return List;
    }
    
    void headInsert(Node* List, int data) {//头插法
        Node* node =(Node*)malloc(sizeof(Node));//新建的一个结点;
        node->data = data;
        node->next = List->next;
        List->next = node;
        List->data++;//头结点开始计数
    }
    
    void tailInsert(Node* List, int data) {//尾插法
        Node* head = List;//后面头结点会改变,先保存下来 
        Node* node = (Node*)malloc(sizeof(Node));//新建的一个结点;
        node->data = data;
        node->next = NULL;
        List = List->next;//指向第一个保存数据的结点,开始遍历找最后一个结点
        while (List->next != NULL) {
            List = List->next;
        }//遍历结束找到头结点
        List->next = node;//让最后一个结点指向新结点
        head->data++;//头结点计数
    }
    
    void deleteNode(Node *List, int data) {//删除结点,输入想删除的数data
        Node* pre = List;//后面会改变头结点先找个替身pre
        Node* current = List->next;//设第一个保存数据的结点为当前结点current
        while (current != NULL) {//遍历查找想要删除的数据data所在的结点
            if (current->data == data) {
                pre->next = current->next;
                free(current);
                current = pre;   //修改//break;
                List->data--;    //修改
            }
            pre = current;
            current = current->next;
        }
    }
    
    void printList(Node* List) {//遍历带头结点的单链表
        List = List->next;//指向第一个保存数据的结点,开始遍历
        while (List != NULL) {
            printf("%d ", List->data);
            List = List->next;
        }
        printf("\n");
    }
    
    int main() {
        Node* List = initList();//创建头结点
        headInsert(List, 1);
        headInsert(List, 2);
        headInsert(List, 3);
        headInsert(List, 3);
        headInsert(List, 3);
    
        tailInsert(List, 4);
        tailInsert(List, 5);
        tailInsert(List, 6);
        printList(List);
        
        deleteNode(List, 3);
        printList(List);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月3日
  • 已采纳回答 10月26日
  • 创建了问题 10月26日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看