main.c檔案
#include #include "headnode.h"
int main()
for (i = 0; i < 20; i++)
// 錯誤1:空表的情況下插入節點
//insert_pos(head, 0, 2);
// 正確:空表的情況下在第乙個節點處插入
//insert_pos(head, 1, 2);
// 錯誤2:空表的情況下在非第乙個節點處插入
//insert_pos(head, 2, 2);
// 正確:在最後乙個節點後面插入
//insert_pos(head, 2, 2);
// 錯誤3:越界
//insert_pos(head, 5, 2);
//insert_pos(head, 11, 200);
display_list(head);
//reverse_list(head);
//delete_data(head, 11);
//delete_pos(head, 1);
if (find_element(head, 300) == ok)
printf ("有\n");
else
printf ("沒有\n");
printf ("%d\n", get_element(head, 5));
printf ("len = %d\n", get_len(head));
display_list(head);
return 0;
}
headnode.c檔案
#include "headnode.h"
#include #include // 建立鍊錶,所謂建立鍊錶,就是建立乙個頭結點
node* create_list()
int insert_head(node* head, elementtype data)
node->data = data;
node->next = head->next; // 讓新結點指向當前的第乙個結點
head->next = node; // node變成了當前的第乙個結點
return ok;
}int insert_last(node* head, elementtype data)
node *node = (node*)malloc(sizeof(node)/sizeof(char));
if (node == null)
node->data = data;
node->next = null;
// 找到next為空的結點
node *tmp = head;
while(tmp->next)
tmp->next = node;
return ok;
}int insert_pos(node* head, int pos, elementtype data)
node *tmp = head;
int k = 0;
while (tmp != null && k < pos -1)
if (tmp == null) // 越界
node *node = (node*)malloc(sizeof(node)/sizeof(char));
if (node == null)
node->data = data;
node->next = tmp->next;
tmp->next = node;
return ok;
}int reverse_list(node *head)
node *p = head->next->next; // 第二個結點
node *q = head->next; // 第乙個結點
node *temp;
while (p)
// 把第乙個節點的下乙個節點置為空
head->next->next = null;
// 重置頭節點的next
head->next = q;
return ok; }
int delete_data(node* head, elementtype data)
node *tmp = head;
while(tmp->next)
if (tmp->next != null) // 找到了存data結點的前乙個結點
return ok;
}int delete_pos(node* head, int pos)
node *tmp = head;
int k = 0;
while (tmp != null && k < pos -1)
if (tmp == null || tmp->next == null) // 越界
node *p = tmp->next;
tmp->next = p->next;
free(p);
return ok;
}int find_element(node* head, elementtype data)
node *tmp = head->next;
while(tmp)
if (tmp == null)
return error;
return ok;
}elementtype get_element(node* head, int pos)
node *tmp = head->next;
int k = 1;
while (tmp != null && k < pos)
if (tmp == null)
return tmp->data;
}int get_len(node * head)
return count;
}void display_list(node* head)
putchar('\n');
}int clean_list(node * head)
return ok;
}int destroy(node *head)
headnode.h檔案
#ifndef __headnode_h__
#define __headnode_h__
#define ok 0
#define error -1
typedef int elementtype;
// 鍊錶的節點
typedef struct _node
node;
// 建立鍊錶
node* create_list();
// 插入資料:頭插法
int insert_head(node* head, elementtype data);
// 插入資料:尾插法
int insert_last(node* head, elementtype data);
// 在 第 pos 個節點處插入資料 約定:鍊錶沒有第0個節點,從第乙個節點開始
int insert_pos(node* s, int pos, elementtype data);
// 逆序
int reverse_list(node *head);
// 鍊錶資料列印
void display_list(node* head);
// 刪除指定資料
int delete_data(node*, elementtype data);
//刪除 第 pos 個結點
int delete_pos(node*, int pos);
// 查詢元素:檢視順序表中是否有對應的元素,有返回元素的索引
int find_element(node* s, elementtype data);
// 獲取順序表中的元素:通過下標獲取
elementtype get_element(node* s, int pos);
int get_len(node * head);
int clean_list(node * head);
// 銷毀順序表
int destroy(node *);
#endif // __headnode_h__
頭節點鍊錶
linklist.h ifndef linklist h define linklist h define false 0 define true 1 typedef int linkdata typedef struct node node 建立鍊錶 node create list 尾插 int...
從無頭鍊錶中刪除節點
程式設計之美 第3.4節 從無頭鍊錶中刪除節點 問題 假設有乙個沒有頭指標的單鏈表。乙個指標指向此單鏈表中間的乙個節點 不是第乙個也不是最後乙個節點 請將該節點從單鏈表中刪除 解法 題目中已經說明既不是頭節點也不是尾節點,因此不用考慮特殊情況。要解這個題首先的思路是尋找前乙個節點的指標,但是由於這是...
鍊錶問題技巧 使用偽頭節點
小技巧 對於鍊錶問題,建立頭節點時不知道合適的節點值,因此通常需要先初始化乙個預先指標 偽頭節點 pre,該指標的下乙個節點指向真正的頭結點head。使用預先指標的目的在於鍊錶初始化時無可用節點值。struct listnode listnode pre newlistnode 0 0為預先指標的值...