您的位置:首页 > 其它

线性表学习归纳总结四:线性表链式存储 带头结点

2015-06-10 15:13 453 查看
线性表的链式存储,带有头结点的链表可以减少对特殊情况的判断处理,不需要再对空表进行特殊处理。

在一般单链表中,第一个结点有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函数与不带头结点的单链表的区别!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: