线性表的链式存储结构
一 单链表
将线性表的数据元素储存在不同的不同的储存块中,并加上下一个存储块的指针,形成节点(Node),链表存储结构不需要预先分配存储空间,表结构是在算法的执行过程中动态形成的,对表的扩充或者删除比较方便,能够利用存储器中零散的存储空间。
1 节点类型描述
typedef struct node
{
datatype data;
struct node *next;
}linknode *link;
link p;
p=(link)malloc(sizeof(linknode));
2 单链表的基本操作
(1)创建单链表
link CreateList()
{
link p;
p=(link)malloc(sizeof(linknode))
p->next=null;
return p;
}
输入数据创建单链表
link CreateList()
{
datatype a;
link H;
link r;
link p;
H=(link)malloc(sizeof(linknode))
r=h;
scanf("%d",&a);
while(a!=-1)
{
p=(link)malloc(sizeof(linknode));
r=(llink)malloc(sizeof(linknode));
r->next=p;
p->data=a;
r=p;
scanf("%d",&a);
}
r->next=null;
return H;
}
2 查找 从第一个节点a0起,获取第i节点的指针
Link GetElem(link H,int i)
{
int j=-1;
link p=H;
if(j<0)
{
return (null)
}
while(p->next!=null&&j<i)
{
j++;
p=p->next;
}
if(i==j)
return (p);
else
return null
}
3 定位元素
link LocateItem(link H,datetype e);
{
link p=H->next;
while(p!=nul&&p->data!=e)
{p=p->next;
}
return p;
}
4 前插
void ListInsert(link H,int i,datatype e)
{
link p,r;
if(i==0)
{
p=H
}
else
{
p=GetElem(H,i-1);
}
r=(link)malloc(sizeof(linknode));
r->next=p->next;
r->data=e;
p->next=r;
}
5 删除
void ListDel(link L, int i)
{
link p, r;
if (i == 0)
{
p = H;
}
else
{
p = GetElem(i - 1);
}
if (p&&p->next)
{
p->next = (p->next)->next;
}
else
{
ERROR(i);
}
}
二 单向循环列表
单向循环链表是对单链表的一种改进,将单链表的指针头尾相连,便构成了单向循环链表
三 双向链表
typedef struct dnode
{
datatype data;
struct dnode *prior, *next;
}dlinknode, *dlink;
双向链表有对称性,设P为双向链表中的一个节点,则((p->next)->prior)=p=((p->prior)->next)
设GetList(dlink L,int i),获取节点ai的指针。
1 添加
void Dinsert(dlink L, int i, datatype e)
{
dlink p;
dlink r;
p = GetList(dlink L, i);
if (p == null)
{
Error(i);
}
else
{
r = (dlink)malloc(sizof(dlinknode));
(p->prior)->next = r;
r->prior = p->prior;
r->next = p;
p->prior = r;
r->data = e;
}
}
2 删除
void Ddelte(dlink L, int i)
{
dlink p, q;
p = GetList(dlink L, int i);
if (p == null)
{
Error(i);
}
else
{
(p->prior)->next = p->next;
(p->next)->prior = p->prior;
free(p);
}
}
四 静态链表
浙公网安备 33010602011771号