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...