#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 訪問資料?
uj5u.com熱心網友回復:
由于您希望main通過呼叫 來更改節點指標push,因此您應該將這些指標的地址作為引數傳遞。那是怎么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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384329.html
