本文位置:首页 > > hy >

数据结构学习2——单链表

文章发布时间:2015/5/28 21:29:53



面对劫机行为,到底应该不应该奋勇抵抗?改革为何只砸了老百姓的铁饭碗?如果喜欢上一个人以后,让自己觉得自己很讨厌该怎么办?【星韵】揭秘!你的星座符号代表的意义!高一记叙文审题训练

【洞箫名曲精选54首】商城超市和奢侈品店内可以照相么?为什么?补钙要穴——大都穴玉器打结绳鍏徃濂充笟鍔″憳闄厭娼滆鍒?鍝茬悊浜虹敓鈥︺€愮簿缇庡浘鏂囥€?中国当代作家实力排行榜(组图)妓女文学:两宋词坛上的一枝奇葩如何让作文的语言亮丽生辉如何利用通道抠出复杂背景的图片触摸岁月,让爱在文字里溢香性格决定命运"木绳则直,金淬则刚"怎么翻译成英文比较好?招商引资后,中国经济被外国控制?中国五十六个民族风情营养食材1888例·彩图版【上】超级记忆法完整篇学生版(第三部分续1)1983年严打剑指"大老虎"枪毙多名红二代读博士的经验总结(图文修订版)互联网+:开启园区新未来(附报告18页PPT)谈虚拟货币的合法性及失控?钩针花样图解(二)病从5处来鍙や唬缁濈濂界敺浜?为了他人的温暖,你没义务把自己放到火上烤

虎口夺食需天助    伤官忌娶青龙妻【转】视频:探索系列动物世界动物大观-性行为大清公主婚前宫女先与驸马同房秘闻为了他人的温暖,你没义务把自己放到火上烤

数据结构学习2——单链表

顺序表的缺点:插入和删除需要进行元素的移动

链表:使用节点存储数据元素,节点的地址可以连续也可以不连续

链表分为单链表/双链表/循环链表,这次只说单链表。

单链表中一个节点的组成:数据域+指针域,指针于中存放的是是一个指针,指向下一个节点的地址。

内容包括:单链表的定义/初始化/查找节点/插入节点/删除节点

先上代码:

复制代码
  1 #include<stdio.h>  2 #include<stdlib.h>  3 #include<malloc.h>  4   5 //定义单链表  6 struct node{  7     char data;  8     struct node *next;  9 }; 10 typedef struct node linkList; 11  12 /*单链表结构 13     p  0x804b008 14     *0x804b008 15         data  '\0' 16         next  0x804b018 17         *0x804b018 18             data  'a' 19             next  0x804b038 20             *0x804b038 21                 data  's' 22                 next  ox804b048 23                 *0x804b048 24                     ... 25 注:最后一个节点的next为NULL 26 */ 27  28 //初始化单链表(创建单链表) 29 linkList* linkListCreate() 30 { 31     char ch; 32     //p为创建的单链表,p2链接于p上,p1是p2与p之间的桥梁 33     linkList *p,*p1,*p2; 34     //初始化表头 35     p=(linkList*)malloc(sizeof(linkList)); 36     p->data='\0'; 37     p->next=NULL; 38     p1=p;//将p的首地址给p1,对p1的操作就是对p中元素的操作 39     while((ch=getchar())!='\n') 40     { 41         p2=(linkList*)malloc(sizeof(linkList)); 42         p2->data=ch; 43         p2->next=NULL; 44         p1->next=p2; 45         p1=p2; 46     } 47     return p;//返回链表头指针 48 } 49  50 //查找节点:按序号查找,查找链表list中第n个节点。注:链表头的下一个节点才是第一个节点 51 linkList * ElemLocatebyNum(linkList *list,int n) 52 { 53     int i=0; 54     linkList *p; 55     p=list; 56     while(p!=NULL) 57     { 58         i++; 59         p=p->next; 60         if(n==i) 61         { 62             return p; 63         } 64     } 65     return NULL; 66 } 67  68 //查找节点:按数据元素查找,查找链表list中元素为ch的节点 69 linkList * ElemLocatebyVal(linkList *list,char ch) 70 { 71     linkList *p; 72     p=list; 73     while(p!=NULL) 74     { 75         p=p->next; 76         if(ch==p->data) 77         { 78             return p; 79         } 80     } 81     return NULL; 82 } 83  84 //插入节点:在链表list的第n个节点处插入元素ch 85 void linkListInsert(linkList *list,int n,char ch) 86 { 87     linkList *p,*q; 88     p=ElemLocatebyNum(list,n-1);//链表第n-1个节点 89     if(p==NULL) 90     { 91         printf("insert error!\n"); 92         return; 93     } 94     q=(linkList*)malloc(sizeof(linkList)); 95     q->data=ch; 96     q->next=p->next; 97     p->next=q; 98 } 99 100 //删除节点:删除链表list的第n个节点101 void linkListDelete(linkList *list,int n)102 {103     linkList *p,*q;104     p=ElemLocatebyNum(list,n-1);//链表第n-1个节点105     //q=ElemLocatebyNum(list,n);//链表的第n个节点106     if(p->next==NULL || p==NULL)107     {108         printf("delete error!\n");109         return;110     }111     q=p->next;112     p->next=q->next;113     free(q);//释放第n个节点的内存空间114 }115 116 int main()117 {118     //创建链表119     linkList *p,*q;120     p=linkListCreate();121     q=p->next;//单链表的第一个节点122     printf("craete list/elment:\n");123     while(q)124     {125         printf("%c",q->data);126         q=q->next;127     }128     printf("\n");129     //查找节点:按序号130     q=ElemLocatebyNum(p,4);131     printf("find node/positon 4 elment:%c\n",q->data);132     //查找节点:按数据元素133     q=ElemLocatebyVal(p,'j');134     printf("find node/element is:%c\n",q->data);135     //插入节点136     linkListInsert(p,4,'Q');137     q=p->next;138     printf("insert node/elment:\n");139     while(q)140     {141         printf("%c",q->data);142         q=q->next;143     }144     printf("\n");145     //删除节点146     linkListDelete(p,7);147     q=p->next;148     printf("delete node/elment:\n");149     while(q)150     {151         printf("%c",q->data);152         q=q->next;153     }154     printf("\n");155     return 0;156 }
复制代码

1.链表初始化:这里有一个链表头,用于指向链表的头节点,即链表头的下一个节点即为链表的第一个节点。理解单链表关键是要搞清楚它的存储结构,可以用工具调试看一下,我这里使用的是linux下的kDbg。在输出中输入asdfghjkl后,可以看到链表存储结构如下:

可以看到,每个节点的指针域(next指针)都指向下一个节点的首地址,最后一个节点的指针域为NULL

2.查找节点,有两种查找方式,按序号查找和按数据元素查找。

3.插入节点,一定要注意操作的先后顺序。

4.删除节点,最后一定要将删除节点的内存空间释放掉,避免造成内存泄漏。


之前老是在半夜2~3点钟醒来,爬起来敲肝经,眼睛困得不行,手敲得没力.最近在论坛里看到用棍子什么之类的来推肝经,不失为一个好办法,但对于我这种"懒人"操作起来不是很方便,于是我自己发明了一个很适合我这种"懒人"的推肝方法,和大家分享下:平躺在床上,两脚自然伸直,先用右脚的脚掌底贴住左脚内侧大腿根部,从大腿根部内侧慢慢往下推至脚内裸处,力度以自己感觉舒服为宜,推十几遍后,再用左脚脚掌底推右脚的肝经,

民国十七年暮春,盐务稽核所在扬州召开了一次运销会议,会後中南银行的总经理胡笔江说:「鲥鱼盛於四月,鳞白如银,其味腴美,焦山船鲥尤富盛名,大家如有雅兴,何妨巾车共载,偷得浮生叁日闲逛逛金焦,尝尝船鲥呢!」  於是中南银行镇江分行负责舟车食宿,我们一行男女十馀人,到了镇江,上了小船容与中流了。鲥鱼主要是吃个新鲜,可是鲥鱼离水即死,转瞬馁败变味,镇江虽然近在咫尺,离船登岸已经风味大减,所以一般美食专家们



不存在相应的目录