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

(总结)数据结构之链表的基本操作说明和示例(待补充)

2012-04-05 23:02 603 查看

数据结构之链表的基本操作说明和示例

一:链表的基础知识:

二:链表的分类:
单链表,双链表和循环链表.

1.带有头结点的单链表:
单链表的基本操作---初始化,创建,插入,删除,取某个元素值.....
1).单链表的创建:
a.利用头插法建立单链表:
//建立一个带头结点的单链表
void CreatList_L(LinkList &L,int n)
{

//输入n个元素的值建立带表头结点的单链表
int i;

LinkList p,q;

L = (LinkList)malloc(sizeof(LNode));

//使头结点的指针域为空,即不指向任何地方.
L->next = NULL;

q = L;

//头插法
for (i=n;i>0;--i)
{
//生成一个新结点p
p = (LinkList)malloc(sizeof(LNode));

//读入新结点的数据
printf("\n请输入第%d个结点的数据:",n-i+1);
scanf("%d",&p->data);

p->next = L->next;
L->next = p;
}
}

b.利用尾插法建立单链表:
//建立一个带头结点的单链表
void CreatList_L(LinkList &L,int n)
{

//输入n个元素的值建立带表头结点的单链表
int i;

LinkList p,q;

L = (LinkList)malloc(sizeof(LNode));

//使头结点的指针域为空,即不指向任何地方.
L->next = NULL;

q = L;

//尾插法
for (i=n;i>0;--i)
{
//生成一个新结点p
p = (LinkList)malloc(sizeof(LNode));

//读入新结点的数据
printf("\n请输入第%d个结点的数据:",n-i+1);
scanf("%d",&p->data);
q->next = p;
q = p;
}
p->next = NULL;
}
2).单链表的插入:
难点是在指定位置之前(合法的位置是1到表长+!)插入元素时,寻找到其前一个结点.初始p为L,指向头结点,i为计数器,初始为0,如果p=L->next;i=1;的话插入元素时就会出错(无法插入元素到第一个位置).
//指定位置插入元素的函数InsertList_L
Status InsertList_L(LinkList &L,int pos,ElemType e)
{
//在带头结点的单链表的第pos个位置之前插入数据元素e
int i;
LinkList p;
LinkList q;

p = L;
i = 0;

//寻找第(pos-1)个结点
while (p && i<pos-1)
{
p = p->next;
++i;
}

//没有找到要插入位置的前一个结点
if (!p || i>pos-1)
{
return ERROR;
}

//生成新结点
q = (LinkList)malloc(sizeof(LNode));

//给新结点的数据域赋值
q->data = e;

q->next = p->next;
p->next = q;

return OK;
}
3).取得指定位置的结点元素的值:
[b]合法位置为1到表长,[/b]
Status GetElem(LinkList &L,int pos,ElemType &e)
{
int j;
LinkList p;

//p指向首结点,j为计数器为1
p = L->next;
j = 1;
//顺时针向后移动,直到p指向第pos个元素或者p为空.
while( p && j<pos )
{
p = p->next;
j++;
}

if( !p || j>pos)
{
printf("\n取结点元素值时指定的位置不合法!\n");
return ERROR;
}
e = p->data;
return OK;
}
4).单链表的删除:
关键是要找到待删除位置前一个结点p,然后p->next = p->next->next;解除中间元素的链接关系而删除.
//指定位置删除元素的函数DeleteList_L
Status DeleteList_L(LinkList &L,int pos,ElemType &e)
{
//在带头结点的单链表L中,删除第pos个元素,并由e返回其值
int i;
LinkList p,q;

//寻找到其前一个结点.初始p为L,指向头结点,i为计数器,初始为0,
p = L;
i = 0;

//寻找第(pos-1)个结点
while (p->next && i<pos-1)
{
p = p->next;
++i;
}

//没有找到要删除位置的前一个结点
if (!(p->next)|| i>pos-1)
{
return ERROR;
}

//相等于p->next = p->next->next;只是为了释放删除的结点,借助新的结点过渡
q = p->next;
p->next = q->next;

e = q->data;

free(q);
q = NULL;
return OK;
}

5).显示所有元素的值.
//显示所有的元素值
void DisplyList_L(LinkList &L)
{
LinkList p;
int j;

p = L->next;
j = 0;

printf("\n输出单链表的各个元素!\n");
while(p!=NULL)
{
printf("\t第%d个元素是:%d\n",++j,p->data);
p = p->next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: