博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转载(有删改)]单链表
阅读量:5079 次
发布时间:2019-06-12

本文共 3753 字,大约阅读时间需要 12 分钟。

申明:

转载   http://www.cnblogs.com/Romi/category/348304.html

 

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

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

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

1 #include
2 #include
3 #include
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 }
View Code

1.链表初始化:这里有一个链表头,用于指向链表的头节点,即链表头的下一个节点即为链表的第一个节点。

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

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

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

转载于:https://www.cnblogs.com/-rfq/p/5933619.html

你可能感兴趣的文章
php生成验证码函数
查看>>
【Linux】目录配置
查看>>
SHELL 入门
查看>>
LeetCode Longest Valid Parentheses
查看>>
格式时间转UTC时间
查看>>
使用JAVA反射技术实现代码零耦合与功能无限扩展!
查看>>
listbox拖动排序
查看>>
2019年6月多校联训b层——搜索算法 Problem A 宽搜 营救
查看>>
[No000062]读书八字诀:怎样将书读得通透?
查看>>
BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
查看>>
Servlet下
查看>>
hammer.js
查看>>
LeetCode #151 Two Sum
查看>>
VM Fusion配置静态IP和物理机通讯
查看>>
数据仓库小记(二)
查看>>
【S】SQL SERVER检查临时表占用空间情况
查看>>
mybatis入门(八)
查看>>
springboot+mybatisplus+lombook项目中数据问题。
查看>>
SQL server知识点
查看>>
Promise/Bluebird源码
查看>>