数据结构之链表的基本操作说明和示例
一:链表的基础知识:
二:链表的分类:
单链表,双链表和循环链表.
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).取得指定位置的结点元素的值:
合法位置为1到表长,
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;
}
}