頭節點鍊錶C程式

2021-08-04 15:22:27 字數 4264 閱讀 9507

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為預先指標的值...