我目前正在嘗試學習如何鏈接列表作爲個人項目。我瞭解核心概念,並一直試圖將其實施到c。我的程序看起來應該可以工作,請記住我仍然是編程新手:D在函數中使用雙指針
我創建了一個名爲head的結構指針。 head將指向linked_list中的第一個節點,startPtr將包含head的地址。每次調用函數add時,都會創建一個新節點並在內存中分配一些空間,然後之前創建的節點將指向新節點。
我知道我的程序在哪裏崩潰,但我可以看到爲什麼?它編譯好。上線
(*prevNode)->link = newNode;
這
我的代碼崩潰是我看到這個代碼的方式:我通過雙指針startPtr到函數添加 。然後我使用malloc創建了一個新節點。接下來我參考startPtr(它在函數中被稱爲prevNode),它應該包含head的內存地址....對吧?然後我使用「 - >」表達式來指向稱爲鏈接的頭內的結構指針。
程序只是在這一點結束,我不知道爲什麼。我查看了其他鏈表的c代碼,但其中大多數不使用雙指針,他們只是聲明全局結構和指針。我使用GCC作爲我的編譯器。
任何人都知道爲什麼會發生這種情況?
#include <stdio.h>
#include <stdlib.h>
// STRUCTURES
struct node
{
int data;
struct node *link;
}*head;
void add(int, struct node **);
int main()
{
struct node *head;
struct node **startPtr;
startPtr = head;
struct node *nodePtr;
int userInput;
int inputData;
do{
printf("\n\n1: enter new node\n");
printf("2: Print Nodes\n");
printf("\n\nEnter: ");
scanf("%d", &userInput);
if (userInput == 1)
{
printf("\n\nEnter data:");
scanf("%d", &inputData);
add(inputData, startPtr);
}
}while(userInput == 1);
// printing linked list
nodePtr = head->link;
while(nodePtr->link != NULL)
{
printf("%d\n", nodePtr->data);
nodePtr = nodePtr->link;
}
printf("%d\n", nodePtr->data);
return 0;
}// END main()
void add(int num, struct node **prevNode)
{
// assigning memory for a new node
struct node *newNode = malloc(sizeof(struct node));
(*prevNode)->link = newNode;
newNode->data = num;
newNode->link = NULL;
prevNode = &newNode;
}// END add()
另外我有一個其他問題,我無法找到並在網上回答。當我創建一個指向結構的指針時,例如struct node * ptr ;. structer指針默認存儲它自己的地址。通過它的自我我的意思是結構,所以如果我打印ptr會輸出structer ptr的地址嗎?
除此之外,你的add()函數也被竊聽(它的分配prevNode不會改變調用者的變量)。 – jarmod
對不起,我早上在亂搞,我必須刪除它。我編輯了我的代碼。我是編碼新手,所以我不確定你的意思。我以爲因爲我傳遞了一個指針,所有在該函數中做出的改變都會被寫入指針地址的內存位置。 –
爲什麼重新打開?這是不是重複的「我試圖將數據存儲到單位化指針的地址」?我們不需要解釋爲什麼每天10次沒有意義。存在典型重複是有原因的。 – Lundin