三、链式存储结构
详细实现过程可参考http://blog.youkuaiyun.com/lmj_like_c/article/details/51470071
(一)单链表
1.概念:用一组地址任意的存储单元存放线性表中的元素(这样的结点的序列为链表)
元素(数据的映像)+指针(指向后继元素的存储位置) = 结点
以线性表中第一个数据元素地址为线性表的地址,称为线性表的头指针。
有时为操作方便,在第一个结点的前面加上一个头结点,头结点的指针指向第一个结点的地址,头结点的数据部分为空或存放表长。
若列表的为空,头结点的指针部分为空;
头指针和头结点的异同:
头指针:
指向链表第一个结点的指针,若链表有头结点则有指向头结点的指针。
具有标识作用,一般以链表的名字命名。
头指针是链表的必要元素。
头结点:
是为了操作统一方便而设立,放在第一个结点之前,数据域一般无意义;
有了头结点后,在对第一个元素结点之前插入结点和删除第一个结点与其他操作与其他结点的操作统一;
头结点不是必要元素;
2.结点和单链表的C语言描述
Typedf struct LNode
{
Elemtype data;
Sturct LNode *next;
}LNode, *LinkList;
LinkNode L;//head node
3.单链表操作的实现
a.Getelem(L,i,&e) //get position i element;
Status Getelem_L(LinkList L,int i,Elemtype &e)
{
P = L->next;j = 1;
While (p && j<i)
{
p = p->next; ++j;
}
If (!P || j > i)
Return -1;
e=p->data;
Return 0;
}//O(listlength(L))
b.ListInsert(&L,i,e)//insert
Status ListDelete(LinkList &L,int i,Elemtype e)
{
p = L;j = 0;
while (p && j<i-1)
{
p = p->next; ++j;
}
If (!P || j > i)
Return 0;
S = new LNode;
If(s == Null) return -1;
S->data = e;
S->next=p->next;
P->next = s;
Return 0;
}//O(listlength(L))
//前插改变指定结点的前驱指针,后插改变指定结点指针
//前插可使用后插实现(后插之后交换指定数据域)
//O(n)
c.ListDelete(&L,i,e)//delete
Status Listdelete(LinkList &L,int i,Elemtype e)
{
p = L;j = 0;
while (p && j<i-1)
{
p = p->next; ++j;
}
If (!(P->next) || j > i-1)
Return -1;
q = p->next; p->next = q->next;
e = q->data;
delete(q);
Return 0;
}//O(n)
d.ClearList(&L)//set null
Void ClearList(LinkList &L)
{
while (L->next)
{
p = L->next;
L->next = p->next;
Delete(p);
}
}//O(n)
e.CreateList(&L,n)// new List
Void CreatList(LinkList &L,int n)
{
Int i = 0;
L = new Lnode; L->next = null;
For (i= 1; i <= n; i++)
{
P = new LNode;
Scanf(&p->data);
P->next = L->next;
L->next = p;
}
}//O(listlength(L))