| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦   
共有 390 人关注过本帖
标题:静态链表提问
收藏  订阅  推荐  打印
yxlovemoney
Rank: 1
等级:新手上路
帖子:10
积分:218
注册:2007-6-3
静态链表提问

这是从严蔚敏,数据结构出写出来的,(作了一点点修改)
复制内容到剪贴板
代码:
#include<stdio.h>
#define MAXSIZE 1000

typedef struct
{
    int data;   //存储数据
    int cur;    //相当于  *next
}component,SLinkList[MAXSIZE];

void InitSpace(SLinkList *space) //初始化
{
    //将一维数组space中各分量链成一个备用链表,space[0].cur为头指针,"0"表示空指针。
    int i;
    for(i=0;i<MAXSIZE-1;++i) space[i]->cur = i + 1;
    space[MAXSIZE-1]->cur = 0;
}

int Malloc(SLinkList *space)
{
    //若备用空间链表非空,则返回分配的结点下标,否则返回0
    int i;
    i = space[0]->cur;
    if(space[0]->cur) space[0]->cur = space[i]->cur; //相当于逐渐向前移
    return i;
}

void Free(SLinkList *space,int k)
{
    //将下标为k的空闲结点回收到备用链表
    space[k]->cur = space[0]->cur;
    space[0]->cur = k;
}
int LocateElem(SLinkList s,int e)
{
    //在静态单链线性表L中查找第1个值为e的元素
    int i;
    i = s[0].cur;

    while(i && s[i].data!=e) i = s[i].cur; //i = s[i].cur相当于p = p->next;
    return i;
}

void difference(SLinkList *space)
{
    //依次输入集合A和B的元素,在一维数组space中建立表示集合(A-B)U(B-A)
    //的静态链表,S为头指针,假设备用空间足够大,space[0].cur为其头指针。
    int s;
    int r,p,m,n,j,i,b,k;
    InitSpace(space);        //初始化备用空间
    s = Malloc(space);       //生成S的头结点
    r = s;                   //r指向s的当前最后结点  r取得第一个位置
    printf("please enter A and B elements\n");
    scanf("%d,%d",&m,&n);    //输入A和B的元素个数

    for(j=1;j<=m;++j)        //建立集合A的链表
    {
        i = Malloc(space);   //分配结点         i取得第二个位置
        scanf("%d",&space[i]->data);//输入A元素值
        space[r]->cur = i;   //插入到结尾
        r = i;
    }
    space[r]->cur = 0;       //尾结点指针为空
    
    for(j=1;j<=n;++j)        //依次输入B的元素,若不在当前表中,则插入否则删除
    {
        scanf("%d",&b);      //先取得数据
        p = s;
        k = space[s]->cur;   //指向集合A中第一个结点 即有数据的结点

        while(k!=space[r]->cur && space[k]->data!=b) //当前表中查找
        {
            p = k;            //接收找到 b 的位置
            k = space[k]->cur;//向前移
        }

        if(k==space[r]->cur) //当前表中不存在该元素,插入在r所指结点之后,且r的位置不变
        {
            i = Malloc(space);
            space[i]->data = b;
            space[i]->cur = space[r]->cur;
            space[r]->cur = i;
        }
        else                //该元素存在表中,删除
        {
            space[p]->cur = space[k]->cur;
            Free(space,k);
            if(r==k) r = p; //若删除的是r所指结点,则需修改尾指针
        }

    }

}

/*void display(SLinkList *space)
{
    int i,head;
    head = space[0]->cur;
    for(i=0;i<20;i++)
    {
        printf("%d,%d\n",space[head]->cur,space[head]->data);
        head = space[head]->cur;
    }
    printf("\n");

}*/
void main()
{
    SLinkList ss;
    difference(&ss);
    //display(&ss);
}
为什么运行时会有问题呢?请大大们指教下.
2008-7-1 22:49
cdj_cjf
Rank: 1
等级:新手上路
帖子:27
积分:370
注册:2008-7-16

讲的好啊
详细资料在
http://bbs.palmjob.net/掌中技术论坛
2008-7-16 14:43
共有 389 人关注过本帖
发新话题
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.055280 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved