接收 '进程终止,状态为 -1073741819

Receiving 'Process terminated with status -1073741819

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
    int num;
    int deg;
    struct node* nxt;
    struct node* prv;

};
typedef struct node node_t;


void push(node_t *head, node_t *last, int number, int degree){
    node_t *newNode = (node_t*)malloc(sizeof(node_t));
    newNode->num = number;
    newNode->deg = degree;

    newNode->nxt = NULL;
    newNode->prv = NULL;

    if(head == NULL){
        head = newNode;
        last = newNode;
    }
    else{
       
        last->nxt = newNode;
        newNode->prv = last;
        last = newNode;
    }
}

int main(){
    node_t *pol1 = NULL;
    node_t *pol1F=NULL;
    int dataNum, dataDeg;
    dataNum =1;
    dataDeg =2;
    push(pol1, pol1F, dataNum , dataDeg);
    printf("%d", pol1->num );
    free(pol1);
    free(pol1F);

    return 0;
}

尝试从节点打印数字时,我得到状态 -1073741819。函数中,据我所知,应该把head和pol1联系起来,进入第一个if,考虑head = NULL。将来我将添加其他节点并为第二个链表创建另一个“头”。 如何从 pol1 访问数据?

由于您希望通过调用 push 来更改 main 中的节点指针,因此您应该将这些指针的地址作为参数传递。这就是 push 知道要更改什么的方式。正如您目前拥有的那样,它只会修改其局部变量的值。

其次,为了在最后释放内存,你不应该对两个指针都调用free,因为它们可能指向同一个节点。当您只将一个节点添加到列表中时就是这种情况。另一方面,如果您的列表有超过 2 个节点,您还需要释放那些中间节点。总而言之,您应该创建一个循环来访问每个节点并释放它。或者,为什么不创建一个 pop 函数,从列表中删除尾节点。然后你可以重复调用那个函数直到列表为空。

最后,pol1pol1F都不是很具描述性的变量名。为什么不只是 headtail

这是一个更正和一些您可以使用的相关函数:

void push(node_t **head, node_t **last, int number, int degree) {
    node_t *newNode = malloc(sizeof(node_t));
    newNode->num = number;
    newNode->deg = degree;
    newNode->nxt = NULL;
    newNode->prv = NULL;

    if (*head == NULL) {
        *head = newNode;
        *last = newNode;
    } else {
        (*last)->nxt = newNode;
        newNode->prv = *last;
        *last = newNode;
    }
}

void pop(node_t **head, node_t **last) {
    if (*head == NULL) {
        return;
    }
    if (*head == *last ) {
        free(*head);
        *head = NULL;
        *last = NULL;
    } else {
        *last = (*last)->prv;
        free((*last)->nxt);
        (*last)->nxt = NULL;
    }
}

void clearList(node_t **head, node_t **last) {
    while (*head != NULL) {
        pop(head, last);
    }
}

void printList(node_t *head) {
    while (head != NULL) {
        printf("(%d, %d) ", head->num, head->deg);
        head = head->nxt;
    }
    printf("\n");
}

int main() {
    node_t *head = NULL;
    node_t *tail = NULL;
    push(&head, &tail, 1, 20);
    push(&head, &tail, 2, 18);
    push(&head, &tail, 3, 21);
    printList(head);
    clearList(&head, &tail);
    return 0;
}