C语言的单向链表的操作方法
生活随笔
收集整理的這篇文章主要介紹了
C语言的单向链表的操作方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫寫基于C語言的單向鏈表的基本操作的實現,
包括輸入初始化、
判斷鏈表是否為空、
獲取鏈表的長度、
在鏈表指定位置插入數據、
修改指定位置的數據、
刪除指定位置的數據、
查找指定位置的數據內容、
查找數據內容對應的位置在哪、
遍歷鏈表、
清空鏈表數據、
刪除鏈表數據。
直接貼上代碼,已在devc++上驗證通過,內容中如有不正確的地方,望留言指出。
linear_link_line.h頭文件
typedef int ElemType; typedef struct {ElemType data;struct line_node_t *next; }line_node_t;line_node_t* initial_list(line_node_t* list); int is_list_empty(); int get_list_length(); int insert_list_pos_data(line_node_t* list, int pos, ElemType data); int modify_list_pos_data(line_node_t* list, int pos, ElemType data); int delete_list_pos_data(line_node_t* list, int pos); int find_list_pos_data(line_node_t* list, int pos, ElemType *data); int find_list_data_of_pos(line_node_t* list, ElemType e, int *pos); void dump_list(line_node_t *list); void clean_list(line_node_t *list); line_node_t* destroy_list(line_node_t *list); int test_func();linear_link_line.c的方法實現
#include <stdio.h> #include "linear_link_line.h"int is_list_empty(line_node_t* list) {return list->next == NULL; }int get_list_length(line_node_t* list) {int len = 0;if(is_list_empty(list)) return 0;line_node_t* p = list->next;while(p) {len++;p = p->next;}return len; }line_node_t* initial_list(line_node_t* list) {int x;line_node_t *p = NULL;line_node_t *q = NULL;p = list;while(1) {scanf("%d", &x);if (x == -1) {printf("initial_list input done.\n");break;}q = (line_node_t *)malloc(sizeof(line_node_t));if (q) {q->data = x;q->next = NULL;p->next = q;p = p->next;} else {printf("initial_list malloc failed!\n");return NULL;}}return list; }int insert_list_pos_data(line_node_t* list, int pos, ElemType data) {int max_len = get_list_length(list);if (pos < 0 || pos > max_len) {printf("insert_list_data pos:%d is invalid! \n", pos);return -1;}line_node_t *p = list;int j = 0;//move point to pos positionwhile (p && j < pos -1) {j++;p = p->next;}line_node_t *insert_point = (line_node_t *)malloc(sizeof(line_node_t));insert_point->data = data;insert_point->next = p->next;p->next = insert_point;//printf("insert_list_data insert suceess!\n");return 0; }int delete_list_pos_data(line_node_t*list, int pos) {line_node_t *p = list;int j = 0;while (p && j < pos -1) {j++;p = p->next; }line_node_t *q = p->next;p->next = q->next;free(q);//printf("delete_list_data success! \n");return 0; }int find_list_pos_data(line_node_t* list, int pos, ElemType *data) {line_node_t *p = list->next;int j = 0;while(p && j < pos -1) {p = p->next;j++;}if (j > pos -1) {printf("find_list_data cannot find pos:%d \n", pos);return -1;}*data = p->data;printf("\nfind_list_data found pos:%d data is: %d \n", pos, *data);return *data; }int find_list_data_of_pos(line_node_t* list, ElemType e, int *pos) {line_node_t *p = list->next;int ret = 0;int j = 0;while (p) {j++;p = p->next;if (p->data == e) {*pos = j + 1;ret = *pos;//printf("find_list_data_pos found %d in pos:%d \n", e, j + 1);break;}}return ret; }int modify_list_pos_data(line_node_t* list, int pos, ElemType data) {line_node_t *p = list->next;int j = 0;while(p && j < pos -1) {j++;p = p->next;}p->data = data;return 0; }void dump_list(line_node_t *list) {line_node_t *p = NULL;p = list->next;while(p) {printf("dump_list value is %d \n", p->data);p = p->next;}return; }void clean_list(line_node_t *list) {line_node_t *p = NULL;p = list->next;while(p) {p->data = 0; p = p->next;}printf("clean_list done. \n");return; }//思路:一直讓p指向head的下一個,然后讓head的next指向p的next,把p釋放掉 循環到最后就剩下head的next為NULL了 line_node_t* destroy_list(line_node_t *list) {printf("destroy_list start.\n");line_node_t *p = NULL;while (list->next) {p = list->next;list->next = p->next;free(p);} printf("destroy_list done.\n");return NULL; }int test_func() {printf("=== please initial list data, entry -1 end loop === \n");return 0; }測試方法my_main.c
int main() {test_func();line_node_t list;initial_list(&list);dump_list(&list);//get list lengthint len = get_list_length(&list);printf("get_list_length len is: %d \n", len);//insert data to listprintf("\ninsert pos 2 data is 10 \n");insert_list_pos_data(&list, 2, 10);dump_list(&list);//delete position dataprintf("\ndelete pos 3 data \n");delete_list_pos_data(&list, 3);dump_list(&list);//find postion data value//ElemType data = NULL;ElemType data = find_list_pos_data(&list, 2, &data);printf("find pos 2 value is %d\n", data);//find data position in listint pos = find_list_data_of_pos(&list, 3, &pos);printf("\nfind value %d is in pos:%d \n", 3, pos);//modify position dataprintf("\nmodify pos:%d to %d\n", 3, 20);modify_list_pos_data(&list, 3, 20);dump_list(&list);printf("\nclean list content. \n");clean_list(&list);dump_list(&list);printf("\n destroy list.\n");destroy_list(&list);dump_list(&list);int len2 = get_list_length(&list);printf("get_list_length len2 is: %d \n", len2);return 0; }運行結果:
=== please initial list data, entry -1 end loop === 1 2 3 4 5 -1 initial_list input done. dump_list value is 1 dump_list value is 2 dump_list value is 3 dump_list value is 4 dump_list value is 5 get_list_length len is: 5insert pos 2 data is 10 dump_list value is 1 dump_list value is 10 dump_list value is 2 dump_list value is 3 dump_list value is 4 dump_list value is 5delete pos 3 data dump_list value is 1 dump_list value is 10 dump_list value is 3 dump_list value is 4 dump_list value is 5find_list_data found pos:2 data is: 10 find pos 2 value is 10find value 3 is in pos:3modify pos:3 to 20 dump_list value is 1 dump_list value is 10 dump_list value is 20 dump_list value is 4 dump_list value is 5clean list content. clean_list done. dump_list value is 0 dump_list value is 0 dump_list value is 0 dump_list value is 0 dump_list value is 0destroy list. destroy_list start. destroy_list done. get_list_length len2 is: 0總結
以上是生活随笔為你收集整理的C语言的单向链表的操作方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当对项目强名时自动构建失败(TeamFo
- 下一篇: DropDownList 不能有多个项被