單向鍊錶的操作

2021-08-01 19:01:38 字數 4075 閱讀 1710

has_head_list.h

#ifndef _has_head_list_h_

#define _has_head_list_h_

#define _crt_secure_no_warnings

#include #include #include #define debug(format, ...) \

do while (0)

#define error(format, ...) \

do while (0)

struct node

;//初始化乙個鍊錶

void init_list(struct node **head_p);

//建立乙個節點

struct node *make_node(int data);

//釋放乙個節點

void free_node(struct node *node);

//插入乙個節點(頭)

int insert_node_from_begin(struct node *head, struct node* node);

//插入乙個節點(尾)

int insert_node_to_end(struct node *head, struct node* node);

//查詢乙個節點

struct node *search(struct node *head, int data);

//刪除乙個節點

int delete_node(struct node *head, struct node *del_node);

//銷毀整個鍊錶

void destory_list(struct node **head_p);

//遍歷鍊錶

void print_list(struct node *head);

//逆序單向鍊錶

int reverse(struct node *head);

void print_node(struct node *node); //void ()(struct node *)

void add_node(struct node *node);

void for_each(struct node *head, void(*fp)(struct node*));

#endif

has_head_list.c

#include "has_head_list.h"

void init_list(struct node **head_p)

head = (struct node *)malloc(sizeof(struct node));

if (head == null)

head->data = -1; //無意義

head->next = null;//代表是空鍊錶

*head_p = head;

}struct node *make_node(int data)

new_node->data = data;

new_node->next = null;

return new_node;

}//釋放乙個節點

void free_node(struct node *node)

}//插入乙個節點(尾)

int insert_node_to_end(struct node *head, struct node* node)

//找到last_node

for (last_node = head; last_node->next != null; last_node = last_node->next)

//讓最後乙個節點的下乙個指標 指向 node就可以了

last_node->next = node;

node->next = null;

return 0;

}//插入乙個節點(頭)

int insert_node_from_begin(struct node *head, struct node* node)

//讓新節點的下乙個的方向 跟head->next一樣

node->next = head->next;

head->next = node;

return 0;

}//銷毀整個鍊錶

void destory_list(struct node **head_p)

head = *head_p;

//刪除所有鍊錶元素

for (p = head->next; p != null; )

//刪除頭結點本身

free_node(head);

*head_p = null;

}//查詢乙個節點

struct node *search(struct node *head, int data)

for (p = head->next; p != null; p = p->next) }

return null;

}//刪除乙個節點

int delete_node(struct node *head, struct node *del_node)

//由於要通過p能夠指向元素的前驅, 所以p應該從head開始遍歷, 因為首元素的前驅就是head

for (p = head; p->next != null; p = p->next)

} return 0;

}//逆序單向鍊錶

int reverse(struct node *head)

//對空鍊錶的處理

if (head->next == null)

p = head->next;//p一開始應該指向首元素

p_prev = head;//首元素的前驅就是head

while (p != null)

//將原先的首元素的next 指向null

head->next->next = null;

//head->next指向新的首元素 此時就是p_prev

head->next = p_prev;

return 0;

}//遍歷鍊錶

void print_list(struct node *head)

for (p = head->next; p != null; p = p->next) }

//列印乙個節點

void print_node(struct node *node) //void ()(struct node *)

//給乙個節點的數值自增1

void add_node(struct node *node)

//void for_each(struct node *head, void(*fp)(struct node*))

}

main.c

#define  _crt_secure_no_warnings 

#include #include #include #include "has_head_list.h"

int main(int argc, char **argv)

//遍歷

print_list(head);

printf("請輸入要刪除的節點:");

scanf("%d", &data);

del_node = search(head, data);

if (del_node != null)

//printf("%d\n", strlen("abc"));

printf("----\n");

reverse(head);

//print_list(head);

for_each(head, print_node);

for_each(head, add_node);

for_each(head, print_node);

//銷毀鍊錶

destory_list(&head);

if (head == null)

return 0;

}

單向鍊錶操作

今天花了一天時間把單向鍊錶的建立,增加,刪除,修改,查詢,遍歷等問題用c 實現了一遍,把以前好多模糊的地方,終於弄清楚了。現在把這些內容記錄下來。1.建立單向鍊錶結點 我們通常用乙個結構體表示鍊錶結點,如下 struct listnode 2.插入新結點 bool insertlistnode li...

單向鍊錶的操作

1.單向鍊錶的建立 鍊錶建立後,其實,此時我們只可以知道head,而後通過head訪問每乙個節點成員。這是比較簡單的鍊錶,其中沒有其它的資訊了。如果需要建立有環的鍊錶,則將尾節點的next指標指向中間乙個節點即可。首先找到尾節點,而後將尾部節點的next指向中間乙個節點即可。如何判斷乙個鍊錶是否存在...

單向鍊錶的操作

include using namespace std typedef char elemtype 定義char型別的elemtype,方便修改 typedef struct lnode 定義乙個結構體 linklist void initlist linklist l void createlis...