日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单链表实现

發布時間:2024/4/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单链表实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單鏈表:1、邏輯上連續,位置上可以不連續的存儲方式。

2、單鏈表由無數個結點組成,每個結點由數據段和指針域組成,數據段存儲數據,指針域存儲后繼的地址。

3、每個結點最多有一個前繼和一個后繼。

4、其中第一個結點沒有前繼,所以我們通常建立一個頭結點來保存他的位置,其中頭結點的數據段我們不關注。

5、最后一個結點沒有后繼,所以我們將最后一個結點的指針域賦為NULL.

//函數聲明:"linklist.h"#define??_CRT_SECURE_NO_WARNINGS?1 #include<stdio.h> #include<stdlib.h> typedef?int?ElemType; typedef?struct?linknode {ElemType?data;struct?linknode?*next; }node; void?judgement_memory(node?*?p);????????????????//判斷動態內存是否開辟成功node*?creat_order();????????????????//正向建立鏈表,尾插法 node?*?creat_reverse();?????????????//反向建立鏈表,頭插法void?insert(node?*head,?int?i,?ElemType?x);?????//在i位置上插入值為x的結點void?delete_place(node?*head,?int?i);???????????//刪除i結點 int?delete_element(node?*head,?ElemType?const?x);???????//刪除第一個值為x的結點 void?delete_all_element(node?*ret,?ElemType?x);???????//刪除所有值為x的結點void?find_element(node?*head,?ElemType?const?x);?????//尋找所有值為x的結點位置 void?find_place(node?*head,?int?i);??????????????????//尋找i結點上的元素void?length_list(node?*head);void?output(node?*head);??????????????????????????????//打印鏈表node*?inits_linklist(node?*head);??????????????????//釋放鏈表void?sortrank(node?*head);??????????????????????//對鏈表進行排序int?means();//函數實現:"linklist.c"#include"linklist.h" void?judgement_memory(node?*?p)?????//判斷開辟內存是否成功 {if?(NULL?==?p){perror("out?of?memory:");exit(EXIT_FAILURE);} }node*?creat_order()????????????????????//建立一個具有頭結點單鏈表,順序插入(尾插法) {printf("開始建立:");node?*head,?*p,?*r;int?x?=?0;head?=?(node?*)malloc(sizeof(node));?????????????//建立頭結點judgement_memory(head);r?=?head;while?(1){scanf("%d",?&x);if?(x?!=?0)????????????????????????????????????????//以0作為鏈表結束標志{p?=?(node?*)malloc(sizeof(node));judgement_memory(p);p->data?=?x;r->next?=?p;r?=?p;}elsebreak;}r->next?=?NULL;printf("創建成功\n");return?head; }node?*?creat_reverse()???????????//建立一個具有頭結點的單鏈表,逆序輸入(頭插法) {printf("開始建立:");node?*head,?*p,?*r,?*q;int?x?=?0;head?=?(node?*)malloc(sizeof(node));judgement_memory(head);p?=?(node?*)malloc(sizeof(node));??????????????????//開辟最后一個結點judgement_memory(p);p->next?=?NULL;scanf("%d",?&x);p->data?=?x;?r?=?head;q?=?p;r->next?=?q;while?(1){scanf("%d",?&x);if?(x!=?0){p?=?(node?*)malloc(sizeof(node));judgement_memory(p);p->data?=?x;r->next?=?p;p->next?=?q;q?=?p;}elsebreak;}printf("創建成功\n");return?head; }void?insert(node?*head,?int?i,?ElemType?x)?????????????????//插入一個結點 {node?*r;node?*s?=?(node?*)malloc(sizeof(node));judgement_memory(s);s->data?=?x;while?(NULL?!=?head&&i>1)????//要在第i個結點上插入,則先找到第i-1個結點{i--;head?=?head->next;}if?(NULL?!=?head&&i!=0)??????????????//判斷是不是頭結點和結點是否存在{r?=?head->next;head->next?=?s;s->next?=?r;printf("插入成功\n");}elseprintf("結點不存在\n"); }void?delete_place(node?*head,?int?i)?????????????????//刪除鏈表中一個指定位置的結點 {node?*p;if?(NULL?==?head)?????????????????????????????????{printf("鏈表下溢\n");}else{while?(NULL?!=?head&&i>1)????????????//找到第i-1個結點{i--;head?=?head->next;}if?(NULL?==?head||i==0)printf("沒有該位置\n");else{p?=?head->next;head->next?=?p->next;free(p);p?=?NULL;printf("刪除成功\n");}} }int?delete_element(node?*head,?ElemType?const?x)???//刪除鏈表中一個指定的x元素 {node?*p,?*q;if?(head?==?NULL)??????????????????????????????//鏈表下溢,-1return?-1;if?(x?==?head->data)???????????????????????????//判斷第一個結點的數據是不是x{p?=?head;head?=?head->next;??????????????????????????free(p);p?=?NULL;return?0;}else{while?(NULL?!=?head&&head->data?!=?x)?????????//在鏈表剩下的元素中尋找x{q?=?head;head?=?head->next;}if?(NULL?==?head)??????????????????????????????//沒找到返回?0return?0;else{p?=?head;q->next?=?p->next;free(p);p?=?NULL;}}return?1;????????????????????????????????????????????//刪除成功返回1 } void?delete_all_element(node?*ret,?ElemType?x)???????//根據元素刪除,將這個鏈表里面的這個元素的結點全部刪除 {int?m?=?0;int?count?=?0;while?(1){m?=?delete_element(ret,?x);if?(m?==?0?||?m?==?-1)break;count++;}if?(m?==?0){if?(count?==?0)printf("沒有此元素\n");elseprintf("刪除成功\n");}elseprintf("鏈表下溢\n"); }void?find_element(node?*head,?ElemType?const?x)?????????//通過元素查找鏈表中該元素的位置找到返回結點 {head?=?head->next;?????????????????//head是頭結點,head->next指向下一個結點int?count?=?0;int?i?=?0;while?(head){count++;if?(head->data?==?x)????????????????????????????//如果找到輸出count{i++;printf("元素位置:%d\n",?count);}head?=?head->next;}if?(i?==?0)?????????????????????????//如果沒有輸出count,說明沒有x,所以i==0;printf("查詢無果\n");elseprintf("\n"); }void?find_place(node?*head,?int?i)??????????????//通過位置來查找該鏈表中位于此位置的元素 {head?=?head->next;while?(i>1){???????????????????????????????//如果要找第i個結點的元素,則要先找到第i-1個結點i--;head?=?head->next;if?(head->next?==?NULL)break;}if?(i?==?1)printf("結點元素:%d\n",?head->data);elseprintf("查詢無果\n"); }void?length_list(node?*head)???????????//求鏈表長度 {head?=?head->next;int?count?=?0;while?(head){count++;head?=?head->next;}printf("鏈表長度:%d\n",?count); }void?output(node?*head)??????????????????????????//打印鏈表 {head?=?head->next;????????????????????????????//讓頭結點指向下一個結點printf("輸出鏈表:");while?(head?!=?NULL){printf("%d??",?head->data);head?=?head->next;}printf("\n"); }node*?inits_linklist(node?*head)????//初始化鏈表 {node?*p,*r;p?=?head;while?(p?!=?NULL){r?=?p;p?=?p->next;free(r);r?=?NULL;}head?=?NULL;p?=?NULL;printf("初始化成功\n");return?head; }void?sortrank(node?*head)??????????????????????????????????//對鏈表進行排序 {node?*p,?*r;p?=?head->next;ElemType?tmp;while?(p?!=?NULL){r?=?head->next;while?(r->next?!=?NULL){if?((r->data)?>?(r->next->data)){tmp?=?r->data;r->data?=?r->next->data;r->next->data?=?tmp;}r?=?r->next;}p?=?p->next;}printf("排序成功\n"); }int?means()?????????????????????????????????????//選擇方式 {int?means?=?0;while?(1){printf("請選擇的方式:");scanf("%d",?&means);if?(means?==?1?||?means?==?2)break;elseprintf("選擇無效,請重新輸入\n");}return?means; }//函數測試:#include"linklist.h"int?main() {printf("*****************************************\n");printf("*****************************************\n");printf("**1.Creat_LinkList????2.Insert_Element?**\n");printf("**3.Find??????????????4.Delete_Element?**\n");printf("**5.Length_LinkList???6.Output_LinkList**\n");printf("*7.InitsLinkLinst?????8.Sortrank???????**\n");printf("*0.Exit???????????????*******************\n\n\n");node?*ret=NULL;ElemType?x;int?i=0;int?n?=?0;while?(1)??????????????????????????????????????//循環起來,直到選擇0結束{printf("請選擇功能:");scanf("%d",?&n);if?(n?==?0){free(ret);exit(1);}if?(n?==?1?&&?ret?==?NULL){????????????????????????????????????????//選擇正序建立鏈表還是逆序建立鏈表,并且鏈表以0作為結束標志printf("**1.creat_order??2.creat_reverse?**\n");if?(means()?==?1)ret?=?creat_order();elseret?=?creat_reverse();}else?if?(n?!=?1&&?ret?==?NULL)?????????//必須先建立鏈表,才能進行其他操作printf("請建立鏈表\n");else?if?(ret!=NULL&&n!=1){switch?(n){case?2:printf("請輸入要插入的位置和要插入的元素\n");scanf("%d",?&i);scanf("%d",?&x);insert(ret,?i,?x);break;case?3:????????????????????????//選擇根據位置查找還是根據元素查找{printf("**1.find_place?????????2.find_element?**\n");if?(means()?==?1){printf("請輸入要查找的位置:");scanf("%d",?&i);find_place(ret,?i);}else{printf("請輸入要查找的元素:");scanf("%d",?&x);find_element(ret,?x);}}break;case?4:???????????//選擇根據位置刪除還是根據元素刪除???????????????????{printf("**1.delete_place?????2.delete_element?**\n");????if?(means()?==?1){printf("請輸入要刪除的位置:");scanf("%d",?&i);delete_place(ret,?i);}else?????????????????????????????????{printf("請輸入要刪除的元素:");scanf("%d",?&x);delete_all_element(ret,?x);??????????????//根據元素刪除,將這個鏈表里面的這個元素的結點全部刪除}}break;case?5:length_list(ret);break;case?6:???????????????????????????//打印鏈表output(ret);break;case?7:???????????????????????????//初始化鏈表,將鏈表制為空ret?=?inits_linklist(ret);break;case?8:sortrank(ret);break;default:printf("選擇無效,請重新選擇\n");break;}}}system("pause");return?0; }


轉載于:https://blog.51cto.com/11142019/1762047

總結

以上是生活随笔為你收集整理的单链表实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。