创建链表新节点时发生,写入权限冲突

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图

#include<stdio.h>
int main() {
MyLinkedList* linkedList = NULL;
myLinkedListAddAtHead(linkedList, 1);
myLinkedListAddAtTail(linkedList, 3);
myLinkedListAddAtIndex(linkedList, 1, 2); //链表变为1-> 2-> 3
myLinkedListGet(linkedList, 1); //返回2
myLinkedListDeleteAtIndex(linkedList, 1); //现在链表是1-> 3
myLinkedListGet(linkedList, 1);
}
typedef struct MyLinkedList_t {
int val;
struct MyLinkedList_t* next;
} MyLinkedList;

void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
MyLinkedList* newnode =(MyLinkedList*)malloc(sizeof(MyLinkedList));
newnode->val = val;//此处发生写入权限冲突
newnode->next = NULL;
if (obj->next == NULL) {
obj->next = newnode;
return;
}
else {
newnode->next = obj->next;
obj->next = newnode;
}
}

MyLinkedList* myLinkedListCreate() {
MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList));
obj->val = 0;
obj->next = NULL;
return obj;
}

int myLinkedListGet(MyLinkedList* obj, int index) {
if (index < 0 || obj->next == NULL) {
return -1;
}
int curr = 0;
MyLinkedList* listcurr = obj->next;
while (curr < index)
{
if (listcurr = 0) {
return -1;
}
listcurr = listcurr->next;
curr++;
}
if (listcurr != NULL) {
return listcurr->val;
}
return -1;

}

void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
MyLinkedList* newnode = (MyLinkedList*)malloc(sizeof(MyLinkedList));
newnode->val = val;
newnode->next = NULL;
MyLinkedList* curr = obj;
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = newnode;

}

void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
if (index < 0) {
myLinkedListAddAtHead(obj, val);
}
int curr = 0;
MyLinkedList* currnode = obj->next;
while (currnode->next != NULL) {
if (curr = index - 1) {
break;
}
currnode = currnode->next;
curr++;
if (index - 1 != curr) {
return;
}
}
if (curr == index)
{
myLinkedListAddAtTail(obj, val);
}
else if (index > curr) {
return;
}
else {

    MyLinkedList* newnode = (MyLinkedList*)malloc(sizeof(MyLinkedList));
    newnode->val = val;
    newnode->next = currnode->next;
    currnode->next = newnode;
}

}

void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
if (index < 0 || obj->next == NULL) {
return;
}
if (index == 0) {
obj->next = obj->next->next;
return;
}
MyLinkedList* currlist = obj->next;
int curr = 0;
while (currlist->next != NULL) {
if (curr == index - 1) {
break;
}
currlist = currlist->next;
curr++;
}
if (curr = index - 1 && currlist->next != NULL) {
currlist->next = currlist->next->next;
}
}
void myNodeFree(MyLinkedList* node) {
if (node->next != NULL) {
myNodeFree(node->next);
node->next = NULL;
}
free(node);
}
void myLinkedListFree(MyLinkedList* obj) {
myNodeFree(obj);

}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

MyLinkedList * linkedList = (MyLinkedList * )malloc(sizeof(MyLinkedList));
linkedList->next = NULL;
main开头直接给链表创建哨兵节点

这个函数肯定要出问题,但不应该在这啊
传入的obj为NULL,那么if (obj->next == NULL) {会出错。要先判断obj是否为空

void myNodeFree(MyLinkedList* node) void myLinkedListFree(MyLinkedList* obj) 两个函数未做修改调试,其余的修改如下,供参考:

#include <stdio.h>
#include <malloc.h>
typedef struct MyLinkedList_t {
    int val;
    struct MyLinkedList_t* next;
} MyLinkedList;

void myLinkedListAddAtHead(MyLinkedList** obj, int val) {  //修改
    MyLinkedList* newnode = (MyLinkedList*)malloc(sizeof(MyLinkedList));
    newnode->val = val;//此处发生写入权限冲突
    newnode->next = NULL;
    if ((*obj) == NULL) { //if (obj->next == NULL)
        (*obj) = newnode; //obj->next = newnode;
                      //return;
    }
    else {
        newnode->next = (*obj); //修改
        (*obj) = newnode;       //修改
    }
}

MyLinkedList* myLinkedListCreate() {
    MyLinkedList* obj = (MyLinkedList*)malloc(sizeof(MyLinkedList));
    obj->val = 0;
    obj->next = NULL;
    return obj;
}

int myLinkedListGet(MyLinkedList* obj, int index) {
    if (index < 0 || obj == NULL) {  //修改
        return -1;
    }
    int curr = 0;
    MyLinkedList* listcurr = obj;  //修改
    while (listcurr && curr < index) //修改
    {
        //if (listcurr == 0) {  //if (listcurr = 0)
        //    return -1;
        //}
        listcurr = listcurr->next;
        curr++;
    }
    if (listcurr != NULL) {
        return listcurr->val;
    }
    return -1;
}

void myLinkedListAddAtTail(MyLinkedList** obj, int val) {  //修改
    MyLinkedList* newnode = (MyLinkedList*)malloc(sizeof(MyLinkedList));
    newnode->val = val;
    newnode->next = NULL;
    MyLinkedList* curr = (*obj);   //修改
    while (curr->next != NULL) {
        curr = curr->next;
    }
    curr->next = newnode;
}

void myLinkedListAddAtIndex(MyLinkedList** obj, int index, int val) {  //修改
    if (index <= 0) {                           //修改
        myLinkedListAddAtHead(&(*obj), val); //修改
        return;                                 //修改
    }
    int curr = 0;
    MyLinkedList* currnode = (*obj);     //修改
    while (currnode && curr < index - 1) {
        //if (curr == (index - 1)) {  //if (curr = index - 1)
        //    break;
        //}
        currnode = currnode->next;
        curr++;
        //if (index - 1 != curr) {
        //    return;
        //}
    }
    if (!currnode)    //修改
    {
        myLinkedListAddAtTail(&(*obj), val); //修改  
    }
       //else if (index > curr) {
       //    return;
       //}
    else {

        MyLinkedList* newnode = (MyLinkedList*)malloc(sizeof(MyLinkedList));
        newnode->val = val;
        newnode->next = currnode->next;
        currnode->next = newnode;
    }
}

void myLinkedListDeleteAtIndex(MyLinkedList** obj, int index) {
    MyLinkedList* p;
    if (index < 0 || (*obj)->next == NULL) {
        return;
    }
    if (index == 0) {
        p = (*obj);              //修改
        (*obj) = (*obj)->next;  //(*obj)->next = (*obj)->next->next;
        free(p);               //修改
        return;
    }
    MyLinkedList* currlist = (*obj);    //修改
    int curr = 0;
    while (currlist && curr < index - 1) { //修改
        //if (curr == index - 1) {
        //    break;
        //}
        currlist = currlist->next;
        curr++;
    }
    if (currlist->next) { //if (curr = index - 1 && currlist->next != NULL)
        p = currlist->next;       //修改
        currlist->next = p->next;//修改
        free(p);                //修改
    }
}
void myNodeFree(MyLinkedList* node) {
    if (node->next != NULL) {
        myNodeFree(node->next);
        node->next = NULL;
    }
    free(node);
}
void myLinkedListFree(MyLinkedList* obj) {
    myNodeFree(obj);

}
void displaymyLinkedList(MyLinkedList* obj)
{
    MyLinkedList* p = obj;
    while (p) {
        printf(p == obj ? "%d" : "->%d", p->val);
        p = p->next;
    }
    printf("\n");
}

int main() 
{
    MyLinkedList* linkedList = NULL;
    myLinkedListAddAtHead(&linkedList, 1); //修改
    myLinkedListAddAtTail(&linkedList, 3); //修改
    displaymyLinkedList(linkedList);

    myLinkedListAddAtIndex(&linkedList, 1, 2); //链表变为1->2->3
    displaymyLinkedList(linkedList);

    printf("返回:%d\n",myLinkedListGet(linkedList, 1)); //返回2

    myLinkedListDeleteAtIndex(&linkedList, 1); //现在链表是1-> 3
    displaymyLinkedList(linkedList);

    printf("返回:%d\n",myLinkedListGet(linkedList, 1));//返回3
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632