本文目錄一覽:
C語言鏈表原理
每個節點有一個數據域num保存該節點的數據,以及一個next域指向下一個節點的地址。假設某時刻指針p指向鏈表頭結點,通過一個循環不停地將p賦值為p指向的節點的next域的值,即該節點的下一個節點的地址,即可遍歷整個列表。
C語言鏈表的思路
鏈表的一種數據格式:
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode *next;
} LinkNode;
可以用一個
LinkNode * h;
來代表一個鏈表。所以這種情況下,鏈表沒有任何數據就沒有節點、且h 等於 NULL;
創建鏈表、為鏈表增加節點有4步:
申請新節點的堆內存
修改新節點的next 為NULL
讀取數據寫入到該內存的數據區間(從外部文件、網路、標準輸入、內存拷貝…)
將新節點添加到鏈表尾部
創建鏈表代碼實現如下:
LinkNode* Create_LinkList()
{
LinkNode *h = NULL; // 指向鏈表第一個數據節點
LinkNode *tail = NULL; // 指向鏈表最後一個節點
while ( 1 )
{
// 用戶不斷的輸入數據,直到輸入負數
int input ;
scanf(“%d”, input);
if ( input 0 ) {
break;
}
// 申請新節點內存
LinkNode *newNode = (LinkNode *)malloc(sizeof(LinkNode));
// 設置新節點的next
newNode-next = NULL;
// 填充數據
newNode-data = input;
// 添加到鏈表尾
if ( h == NULL ) {
// 若表頭為NULL,說明新節點為第一個節點,則表頭和表尾都為新節點
h = tail = newNode;
} else {
// 否則將tail-next指向新節點,並更新表尾
tail-next = newNode;
tail = newNode;
}
}
// 返回鏈表第一個節點的指針
return h;
}
C語言中的鏈表怎麼理解
鏈表是相同類型的若干個結構體用其自身攜帶的指針按照一定順序串聯成的一個鏈。
舉個簡單例子進行類比:
struct node{
int a;
struct node *next;
};
把這個鏈表節點的結構體struct node看作是人,結構體內的next指針看作是人的一隻手,這隻手只能用於指向人(別人或自己)。
如果有多個人排成一排,每個人都舉起右手指向右邊的人,就形成一個人組成的鏈表。
請教C語言鏈表 求詳細分析錯誤原因 感謝
1 delete函數沒有考慮如果head指向的節點就是要刪除的節點的情況。如果刪除的節點是dead,調用delete函數之後,後續所有操作都是錯誤的。因為把第一個節點刪除之後應該讓head指向下一個。
在遍歷單向鏈表的時候,通常有兩個指針,一個是當前節點(current_node),一個是前一個節點(previous_node)。當遍歷開始時,他們應該都初始化為head。遍歷期間讓current_node = previous_node-next;
當我們刪除的時候要判斷要刪除的節點是不是head,如果是刪除完成後要重新給head賦值。代碼:
Q* deletenode(Q* head, int data)
{
Q* current_node = head, *previous_node = head;
while(current_node != NULL)
{
if (current_node-score == data)
{
if (head == current_node) head = current_node-next;
previous_node-next = current_node-next;
free(current_node);
current_node = previous_node-next ;
continue;
}
previous_node = current_node;
current_node = current_node-next;
}
return head;
}
2 node函數沒有問題,但是list函數感覺有問題,要創建n個節點,直接一個for循環就可以,沒有必要判斷是不是1個節點。list只要返回一個head指針就好,如果傳進如的node節點數為0,直接返回NULL即可。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/152524.html