leiyahui

纸上得来终觉浅,绝知此事要躬行
线性表的链式存储结构

一 单链表

将线性表的数据元素储存在不同的不同的储存块中,并加上下一个存储块的指针,形成节点(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);
    }
}

四 静态链表

 

posted on 2015-11-13 21:16  雷大叔  阅读(164)  评论(0)    收藏  举报