接收 '进程终止,状态为 -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
函数,从列表中删除尾节点。然后你可以重复调用那个函数直到列表为空。
最后,pol1
和pol1F
都不是很具描述性的变量名。为什么不只是 head
和 tail
?
这是一个更正和一些您可以使用的相关函数:
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;
}
#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
函数,从列表中删除尾节点。然后你可以重复调用那个函数直到列表为空。
最后,pol1
和pol1F
都不是很具描述性的变量名。为什么不只是 head
和 tail
?
这是一个更正和一些您可以使用的相关函数:
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;
}