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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

發(fā)布時(shí)間:2023/11/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://blog.csdn.net/abclixu123/article/details/8210109

鏈表也是線性表的一種,與順序表不同的是,它在內(nèi)存中不是連續(xù)存放的。在C語言中,鏈表是通過指針相關(guān)實(shí)現(xiàn)的。而單鏈表是鏈表的其中一種,關(guān)于單鏈表就是其節(jié)點(diǎn)中有數(shù)據(jù)域和只有一個(gè)指向下個(gè)節(jié)點(diǎn)的指針域。創(chuàng)建單鏈表的方法有兩種,分別是頭插法和尾插法。

所謂頭插法,就是按節(jié)點(diǎn)的逆序方法逐漸將結(jié)點(diǎn)插入到鏈表的頭部。反之尾插法就是按節(jié)點(diǎn)的順序逐漸將節(jié)點(diǎn)插入到鏈表的尾部。相對來說,頭插法要比尾插法算法簡單,但是最后產(chǎn)生的鏈表是逆序的,即第一個(gè)輸入的節(jié)點(diǎn)實(shí)際是鏈表的最后一個(gè)節(jié)點(diǎn)。而為了習(xí)慣,通常用尾插法來創(chuàng)建鏈表。下面的代碼就是實(shí)現(xiàn)了頭插法和尾插法。代碼在Linux下調(diào)試通過。

[cpp]?view plaincopy print?
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • ??
  • typedef?struct?link??
  • {??
  • ????char?data;??
  • ????struct?link?*next;??
  • }linklist;??
  • ??
  • linklist?*CreateList_Front();???//頭插法創(chuàng)建單鏈表??
  • linklist?*CreateList_End();?????//尾插法創(chuàng)建單鏈表??
  • void?ShowLinklist(linklist?*h);?//輸出顯示鏈表??
  • ??
  • int?main(void)??
  • {??
  • ????int?choice;??
  • ????linklist?*head;??
  • ??
  • ????//head?=?(linklist*)malloc(sizeof(linklist));??
  • ????while(1)??
  • ????{??
  • ????????printf("單鏈表的創(chuàng)建\n");??
  • ????????printf("1.使用頭插法創(chuàng)建單鏈表\n");??
  • ????????printf("2.使用尾插法創(chuàng)建單鏈表\n");??
  • ????????printf("3.鏈表輸出顯示\n");??
  • ????????printf("4.退出\n");??
  • ????????printf("做出選擇:\n");??
  • ????????scanf("%d",&choice);??
  • ????????switch(choice)??
  • ????????{??
  • ????????//頭插法??
  • ????????case?1:??
  • ????????????head?=?CreateList_Front();??
  • ????????????break;??
  • ????????//尾插法??
  • ????????case?2:??
  • ????????????head?=?CreateList_End();??
  • ????????????break;??
  • ????????//輸出鏈表??
  • ????????case?3:??
  • ????????????ShowLinklist(head);??
  • ????????????break;??
  • ????????//退出程序??
  • ????????case?4:??
  • ????????????return?0;??
  • ????????????break;??
  • ????????default:??
  • ????????????break;??
  • ????????}??
  • ????}??
  • ????return?1;??
  • }??
  • ??
  • linklist?*CreateList_Front()??
  • {??
  • ????linklist?*head,?*p;??
  • ????char?ch;??
  • ??
  • ????head?=?NULL;??
  • ????printf("依次輸入字符數(shù)據(jù)(‘#’表示輸入結(jié)束):\n");??
  • ????ch?=?getchar();??
  • ????while(ch?!=?'#')??
  • ????{??
  • ????????p?=?(linklist*)malloc(sizeof(linklist));??
  • ????????p->data?=?ch;??
  • ????????p->next?=?head;??
  • ????????head?=?p;??
  • ????????ch?=?getchar();?????????????//頭插法算法簡單?核心就兩句p->next?=?head;head?=?p;??
  • ????}??
  • ????return?head;??
  • }??
  • ??
  • linklist?*CreateList_End()??
  • {??
  • ????linklist?*head,?*p,?*e;??
  • ????char?ch;??
  • ??
  • ????head?=?NULL;??
  • ????e?=?NULL;??
  • ????printf("請依次輸入字符數(shù)據(jù)('#'表示輸入結(jié)束):\n");??
  • ????ch?=?getchar();??
  • ????while(ch?!=?'#')??
  • ????{??
  • ????????p?=?(linklist*)malloc(sizeof(linklist));??
  • ????????p->data?=?ch;??
  • ????????if(head?==?NULL)????????//先判斷輸入的是不是第一個(gè)節(jié)點(diǎn)??
  • ????????{??
  • ????????????head?=?p;?????????????
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????e->next?=?p;?????//e始終指向輸入的最后一個(gè)節(jié)點(diǎn)??
  • ????????}??
  • ????????e?=?p;??
  • ????????ch?=?getchar();???????????
  • ????}??
  • ????if(e?!=?NULL)???????????????//如果鏈表不為空,則最后節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)為空??
  • ????{??
  • ????????e->next?=?NULL;??
  • ????}??
  • ????return?head;????????????????//尾插法比頭插法復(fù)雜一些,程序中要做兩次判斷,分別是判斷第一個(gè)節(jié)點(diǎn)和最后一個(gè)節(jié)點(diǎn)的判斷。且消耗多一個(gè)指針變量e。??
  • }??
  • ??
  • void?ShowLinklist(linklist?*h)??
  • {??
  • ????linklist?*p;??
  • ??
  • ????p?=?h;??
  • ????while(p?!=?NULL)??
  • ????{??
  • ????????printf("%c?",?p->data);??
  • ????????p?=?p->next;??
  • ????}??
  • ????printf("\n");??
  • }??

  • 通過上述代碼可以看出,尾插法確實(shí)比頭插法復(fù)雜點(diǎn),多了兩個(gè)判斷。但是這是可以解決的,通過添加一個(gè)頭節(jié)點(diǎn),此節(jié)點(diǎn)不存放數(shù)據(jù)域,只是存放指向下個(gè)節(jié)點(diǎn)的指針域就是了。這樣就可以免除掉兩次判斷。整體也要清晰點(diǎn)了。下面是增加一個(gè)頭節(jié)點(diǎn)后尾插法的實(shí)現(xiàn)代碼:

    [cpp]?view plaincopy print?
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • ??
  • typedef?struct?list??
  • {??
  • ????char?data;??
  • ????struct?list?*next;??
  • }linklist;??
  • ??
  • linklist?*CreateList_End();?????//尾插法創(chuàng)建鏈表??
  • void?ShowLinklist(linklist?*h);?//輸出顯示鏈表??
  • ??
  • int?main(void)??
  • {??
  • ????linklist?*head;??
  • ??
  • ????printf("使用尾插法創(chuàng)建鏈表(改進(jìn)版)\n");??
  • ????printf("請依次輸入字符數(shù)據(jù)(‘#’表示輸入結(jié)束):\n");??
  • ????head?=?CreateList_End();????????//創(chuàng)建鏈表??
  • ????ShowLinklist(head);?????????????//輸出鏈表??
  • }??
  • ??
  • linklist?*CreateList_End()??
  • {??
  • ????linklist?*head,?*p,?*e;??
  • ????char?ch;??
  • ??
  • ????head?=?(linklist*)malloc(sizeof(linklist));??
  • ????e?=?head;???????????//讓e指向頭節(jié)點(diǎn)??
  • ????ch?=?getchar();??
  • ????while(ch?!=?'#')??
  • ????{??
  • ????????p?=?(linklist*)malloc(sizeof(linklist));??
  • ????????p->data?=?ch;???
  • ????????e->next?=?p;?????//把新節(jié)點(diǎn)添加到表尾??
  • ????????e?=?p;??????????????//把指針指向新節(jié)點(diǎn)??
  • ????????ch?=?getchar();??
  • ????}?????
  • ????e->next?=?NULL;??????????//尾節(jié)點(diǎn)的指針域置空??
  • ????return?head;??
  • }??
  • ??
  • void?ShowLinklist(linklist?*h)??
  • {??
  • ????linklist?*p;??
  • ??
  • ????p?=?h->next;??
  • ????while(p?!=?NULL)??
  • ????{??
  • ????????printf("%c?",?p->data);??
  • ????????p?=?p->next;??
  • ????}??
  • ????printf("\n");??
  • }??

  • 添加了一個(gè)頭節(jié)點(diǎn)后代碼是不是就要清晰點(diǎn)了呢?

    總結(jié)

    以上是生活随笔為你收集整理的数据结构学习(二)——单链表的操作之头插法和尾插法创建链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。