c语言 - 接收"进程终止,状态为 -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;
}

相关内容

  • 没有找到相关文章

最新更新