您的位置:首页 > 理论基础 > 数据结构算法

线性表的链式存储结构及操作

2015-08-24 14:51 483 查看
线性表的链式存储结构的结点由数据域和指针域两个部分构成,其中,数据域用于存储数据元素的值,指针域则用于存储当前结点的直接前驱或直接后继的位置信息,链表如图:


 

单链表的节点类型定义为:

typedef struct node
{
elementType data;
struct node *link;
}LNode;

单链表的操作主要有:
(1)创建节点:LNode *CreateNode(elementType x)

(2)创建链表:LNode *CreateLinkList(int n)

(3)查找节点:LNode *FindNode(LNode *l,int k)

(4)添加节点:int InsertNode(LNode *l,int k,elementType newElement)

(5)删除节点:int DeleteNode(LNode *l,int k)

以下是C语言的实现:

#include <stdio.h>
#include <stdlib.h>
#define elementType int

typedef struct node//定义单链表的节点类型
{
elementType data;
struct node *link;
}LNode;

/*创建单链表的一个节点
参数为节点数据域的值
返回指向该节点的指针 */
LNode *CreateNode(elementType x)
{
LNode *r;
r=(LNode*)malloc(sizeof(LNode));//为节点在内存中申请一块空间
r->data=x;
r->link=NULL;
return r; //返回节点指针
}

/*创建一个长度为n的链表
输入N个相应类型的数据元素
最后返此链表的头指针*/
LNode *CreateLinkList(int n)
{
LNode *p,*q,*l=NULL;
elementType e;
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&e);
q=CreateNode(e); //创建个新节点,其数据域的值为e
if(l==NULL)
l=q;
else
p->link=q;
p=q;
}
return l; //返回链表头指针
}

/*在链表中查找第k节点
若找到,返回该结点指针
若没有,返回NULL;*/
LNode *FindNode(LNode *l,int k) //l为指向链表第一个元素节点的头指针
{
LNode *p;
int i=1;
p=l;
while(p!=NULL&&i<k)
{
p=p->link;
i++;
}
if(p!=NULL&&i==k)
return p;
else
return NULL;
}

/*单链表的插入运算
将新元素newElement插入链表的第k个节点之前
若成功返回1,不成功返回0*/
int InsertNode(LNode *l,int k,elementType newElement)//l为指向链表第一个元素节点的头指针
{
LNode *p,*q=NULL;
q=CreateNode(newElement);
if(q==NULL)
return 0;
if(k==1)
{
q->link=l;
l=q;
return 1;
}
else
{
p=FindNode(l,k-1);
if(p==NULL)
return 0;
else
q->link=p->link;
p->link=q;
return 1;
}
}

/*删除链表的第K个节点
若成功返回1,若失败返回0*/
int DeleteNode(LNode *l,int k)//l为指向链表第一个元素节点的头指针
{
LNode *p,*q;
if(k==1)
{
q=l;
l=l->link;
free(q);
return 1;
}
else
{
p=FindNode(l,k-1);
if(p==NULL||p->link==NULL)
return 0;
else
{
q=p->link;
p->link=q->link;
free(q);
return 1;
}
}
}

/*将链表完整的打印出来*/
void Print(LNode *l)
{
LNode *p;
p=l;
if(p==NULL)
{
printf("链表为空");
return;
}
while(p)
{
printf("%d-->",p->data);
p=p->link;
}
printf("\n");
}

int main()
{
LNode *l;
int orNot;
l=CreateLinkList(8); //创建有8个节点的单链表
Print(l); //打印出该链表
orNot=InsertNode(l,6,77); //在链表第6个节点前插入一个节点,其它数据域的值为77
Print(l); //打印插入后的链表
orNot=DeleteNode(l,4); //删除链表的第4个节点
Print(l); //打印删除后的链表
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息