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

【Data】数据结构之线性表(2)

2013-05-03 19:40 288 查看
这一篇主要讲单链表的

另附别家博客

第一个是关于顺序线性表实现的程序:http://www.cnblogs.com/ns517/archive/2008/10/05/1304361.html

第二个是关于链表的程序实现:http://www.cnblogs.com/tao560532/articles/2199280.html

这两位博主贴出的程序大概是可以调试出来的,我贴出的都是函数片段,不能直接调试。

线性链表

1、线性链表的概念

以链式结构存储的线性表称之为线性链表。

特点是该线性表中的数据元素可以用任意的存储单元来存储。线性表中逻辑相邻的两元素的存储空间可以是不连续的。为表示逻辑上的顺序关系,对表的每个数据元素除存储本身的信息之外,还需存储一个指示其直接后继的信息。这两部分信息组成数据元素的存储映象,称为结点。
用线性链表表示线性表时,数据元素之间的逻辑关系是由结点中的指针指示的

2、线性链表的存储实现

struct LNODE{
ElemType data;
struct LNODE *next;
};
typedef struct LNODE LNode;
typedef struct LNODE * LinkList;


头指针与头结点的区别:
头指针只相当于结点的指针域,头结点即整个线性链表的第一个结点,它的数据域可以放数据元素,也可以放线性表的长度等附加信息,也可以不存储任何信息。

3、 线性表的操作实现(C语言 )
(1)初始化操作
Status Init_L(LinkList L){
if (L=(LinkList *)malloc(sizeof(LNode)))//给指针L分配同LNode一样大小的内存
{L->next=NULL;return 1;}
else return 0;
}


(2)插入操作
Status ListInsert_L(LinkList &L,int i,ElemType e)//
{
LinkList *p=L;
j=0;
while(p&&j<i-1)
{     p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
returen OK;
}




(3)删除操作
Status List Delete_L(LinkList &L, int i, ElemType &e)
{
LinkList *p,*q;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return OK;
}




(4)取某序号元素的操作

Status GetElem_L(LinkList &L, int i, ElemType &e)
{
LinkList *p;
j=1;
p=L->next;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
e=p->data;
return OK;
}


(5)归并两个单链表的算法
void MergeList_L(LinkList &la,LinkList &Lb,LinkList &Lc)
{
//已知单链线性表La和Lb的元素按值非递减排列
//归并后得到新的单链线性表Lc,元素也按值非递减排列
LinkList *pa,*pb,*pc;
pa=La->next;
pb=Lb->next;//未指向头结点,大概是这里默认头结点不存放数据吧
Lc=pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next
}
}
pc->next=pa?pa:pb;
free(Lb);     //我看的参考资料里只写了Lb的,La不能释放吗?我觉得ok啊
}


下一篇讲循环链表和双向链表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: