线性表学习归纳总结四:线性表链式存储 带头结点
2015-06-10 15:13
453 查看
线性表的链式存储,带有头结点的链表可以减少对特殊情况的判断处理,不需要再对空表进行特殊处理。
在一般单链表中,第一个结点有head指示,而在带有头结点的单链表中,head指示的是所谓的头结点,它不是数据结构中的实际结点,第一个实际结点是head->next指示的。
链表的存储结构和一般单链表没有区别
基本运算实现函数说明
具体实现函数
main函数
运行结果
Ps:
注意find函数和insert函数与不带头结点的单链表的区别!
在一般单链表中,第一个结点有head指示,而在带有头结点的单链表中,head指示的是所谓的头结点,它不是数据结构中的实际结点,第一个实际结点是head->next指示的。
链表的存储结构和一般单链表没有区别
typedef struct link_node{ datatype info; struct link_node *next; //指向下一个结点的link_node指针 }node;
基本运算实现函数说明
node *init(); //建立一个空的带头结点的单链表 void display(node *head); //输出带头结点的单链表中各个结点的值 node *find(node *head,int i); //在带头结点的单链表中查找第i个结点地址 node *insert(node *head, datatype x, int i); //在带头结点的单链表中第i个结点后插入一个值为x的新结点 node *dele(node *head, datatype x); //在带头结点的单链表中删除一个值为x的结点
具体实现函数
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include "hlnklist.h" /************************************************************************/ /* 函数功能: 建立一个空的带头结点的单链表 */ /* 函数参数: 空*/ /* 函数返回值: 指向node类型变量的指针 */ /* 文件名: hlnklist.c,函数名: init()*/ /************************************************************************/ node *init() { node *head; head=(node*)malloc(sizeof(node)); head->next=NULL; return head; } /************************************************************************/ /* 函数功能: 输出带头结点的单链表中各个结点的值 */ /* 函数参数: 指向node类型变量的指针head*/ /* 函数返回值: 无*/ /* 文件名: hlnklist.c,函数名:display() */ /************************************************************************/ void display(node *head) { node *p; p=head->next; if (!p) { printf("\n带头结点的单链表是空的!"); } else { printf("\n带头结点的单链表各个结点的值为:\n"); while (p) { printf("%5d",p->info); p=p->next; } } } /************************************************************************/ /* 函数功能: 在带头结点的单链表中查找第i个结点地址 */ /* 函数参数: 指向node类型变量的指针head,int类型变量i */ /* 函数返回值: 指向node类型变量的指针head */ /* 文件名: hlnklist.c,函数名:find() */ /************************************************************************/ node *find(node *head,int i) { int j=0; node *p=head; if (i<0) { printf("\n带头结点的单链表中不存在第%d个结点!",i); return NULL; } else if (i==0) { return p; //此时指针指向头结点 } while (p && i!=j) { p=p->next; j++; } return p; } /************************************************************************/ /* 函数功能: 在带头结点的单链表中第i个结点后插入一个值为x的新结点*/ /* 函数参数: 指向node类型变量的指针head,datatype类型变量x,int类型变量i*/ /* 函数返回值: 指向node类型变量的指针head*/ /* 文件名: hlnklist.c,函数名:inser() */ /************************************************************************/ node *insert(node *head, datatype x, int i) { node *p,*q; q=find(head,i); //查找带头结点的单链表中的第i个结点,i=0表示新结点插入在头结点之后,此时q指向的是头结点 if (!q) { printf("\n带头结点的单链表中不存在第%d个结点!不能插入%d!",i,x); return head; } p=(node*)malloc(sizeof(node)); p->info=x; p->next=q->next; q->next=p; return head; } /************************************************************************/ /* 函数功能: 在带头结点的单链表中删除一个值为x的结点 */ /* 函数参数: 指向node类型变量的指针head,datatype类型变量x*/ /* 函数返回值: 指向node类型变量的指针 */ /* 文件名: hlnklist.c ,函数名:dele() */ /************************************************************************/ node *dele(node *head, datatype x) { node *pre=head, *p=head->next;//pre指向头结点,p指向第一个实际结点 while (p && p->info!=x)//没有查完到并且还没有找到 { pre=p; p=p->next;//移动指针向后查找 } if (p) { pre->next=p->next;//删除查找到的结点p free(p);//释放结点p } return head; }
main函数
#include <stdio.h> #include <stdlib.h> #include "hlnklist.h" void main(void) { node* hlnklist; //建立一个空的带头结点的单链表 hlnklist = init(); //初始化时候,为头结点分配了存储空间 //利用插入函数建立带头结点的单链表 int getin; int num = 0; puts("输入单链表的值"); while ((scanf("%d", &getin)) == 1) { hlnklist = insert(hlnklist, getin, num); num++; } display(hlnklist); //在带头结点的单链表中第i个结点后面插入结点x int i; int x; puts("\n在第i个结点后面插入结点x,输入i,x"); while ((scanf("%d,%d",&i,&x))==2) { hlnklist = insert(hlnklist, x, i); display(hlnklist); puts("\n在第i个结点后面插入结点x,输入i,x"); } //在带头结点的单链表中删除一个值为x的结点 puts("输入要删除的结点的值x"); while ((scanf("%d", &x)) == 1) { dele(hlnklist, x); display(hlnklist); puts("\n输入要删除的结点的值x"); } system("pause"); }
运行结果
Ps:
注意find函数和insert函数与不带头结点的单链表的区别!
相关文章推荐
- 【spring+websocket的使用】
- Oracle 11g Data Guard 使用duplicate from active database 创建 standby database
- 开源协议说明
- 【spring+websocket的使用】
- UVA11889:Benefit(已知LCM和其中一个数,求另一个数)
- Java线程(二):线程同步synchronized和volatile
- cocos2dx Socket(二)
- 布尔类型
- 【spring+websocket的使用】
- 扒一扒你身边的项目和这里说的多么相像!!!
- 根据两点间的经纬度计算距离
- iOS和Android的app界面设计规范
- AngularJS创建应用- HTML5 移动框架
- 一个简易的WebServer实现
- 杭电ACM1412——{A} + {B}
- raw_input文件,并打印文件内容
- AOP
- JavaScript -- 使用JavaScript解析JSON格式的字符串
- JUnit学习
- Ubuntu14.04修改用户名,主目录用户路径,不丢失管理员权限