| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 536 人关注过本帖
标题:静态链表的输出有点问题,大家给看看
只看楼主 加入收藏
海莲
Rank: 1
等 级:新手上路
帖 子:19
专家分:5
注 册:2012-9-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
静态链表的输出有点问题,大家给看看
程序代码:
#include<stdio.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct node
{
    datatype data;
    int link;

}snode;
typedef struct
{
    snode nodes[MAXSIZE];
    int newptr;
}slinklist;


void initlist(slinklist sl)
{
    int i;
    sl.nodes[0].link=1;
    sl.newptr=1;
    for(i=1;i<MAXSIZE-1;i++)
        sl.nodes[i].link=i+1;
    sl.nodes[MAXSIZE-1].link=-1;
}

void ceratlist(slinklist sl)
{
    int i=1,j;
    printf("请输入数据到-1时结束:\n");
    scanf("%d",&j);
    while(j!=-1)
{
       sl.nodes[i].data=j;
       i++;
       sl.newptr++;
       if(i>MAXSIZE-1) break;
       scanf("%d",&j);
   }
   sl.nodes[i-1].link=-1;


}

int find(slinklist sl,datatype x)  //按值查找
{
    int p=sl.nodes[0].link;
    while(p!=-1)
        if(sl.nodes[p].data!=x)
            p=sl.nodes[p].link;
        else
            break;
        return p;
}

int locate(slinklist sl,int i)     //按结点查找
{
    int j=0,p=sl.nodes[0].link;
    if(i<0)
        return -1;
   
    while(p!=-1&&j<i)
    {
        p=sl.nodes[p].link;
        j++;
    }
    if(i==0)
        return 0;
    return p;

}

int insert(slinklist sl,int i,datatype x)     //在静态链表第I个结点处插入一个新结点
{
    int p=locate(sl,i-1);       //查找i之前的一个结点
    int q=sl.newptr;
    if(p=-1)
        return 0;//新结点
          
    sl.newptr=sl.nodes[sl.newptr].link;
    sl.nodes[q].data=x;
    sl.nodes[q].link=sl.nodes[p].link;
    sl.nodes[p].link=q;
    return 1;
}

//移除
int remove(slinklist sl,int i)
{
    int p=locate(sl,i-1);
    int q=sl.nodes[p].link;
    if(p==-1)
        return 0;

    sl.nodes[p].link=sl.nodes[q].link;
    sl.nodes[q].link=sl.newptr;
    sl.newptr=q;
    return 1;
}

void output(slinklist sl)
{
    int i,q;
    i=0;q=1;
    printf("输出数据:\n");
   
    while(sl.nodes[q].link!=-1)
    {
        printf("%d\t",sl.nodes[q].data);
        q=sl.nodes[q].link;
        i++;
       
        if(i%5==0)
            printf("\n");
    }


}





void main()
{
    slinklist a;
    initlist(a);
    ceratlist(a);
    output(a);
    getch();
}
在输出时,说访问地址有错误,大家给看看
2012-10-18 13:13
陌小熙
Rank: 1
等 级:新手上路
帖 子:1
专家分:5
注 册:2012-10-18
收藏
得分:5 
试试
#include<stdio.h>
#include<conio.h>
2012-10-18 15:15
海莲
Rank: 1
等 级:新手上路
帖 子:19
专家分:5
注 册:2012-9-27
收藏
得分:0 
回复 2楼 陌小熙
不是这个错误
2012-10-18 15:40
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
问题说的明白点多好呀
2012-10-18 18:40
babylco0
Rank: 2
等 级:论坛游民
威 望:1
帖 子:8
专家分:60
注 册:2012-10-18
收藏
得分:15 
程序代码:
#include<stdio.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct node
{
    datatype data;
    int link;

}snode;
typedef struct
{
    snode nodes[MAXSIZE];
    int newptr;
}slinklist;

slinklist a;

void initlist(slinklist *sl)
{
    int i;
    (*sl).nodes[0].link=1;
    (*sl).newptr=1;
    for(i=1;i<MAXSIZE-1;i++)
    {
        (*sl).nodes[i].link = i + 1;
    }
    (*sl).nodes[MAXSIZE-1].link=-1;
}

void ceratlist(slinklist *sl)
{
    int i=1,j;
    printf("请输入数据到-1时结束:\n");
    scanf("%d",&j);
    while(j!=-1)
{
       (*sl).nodes[i].data=j;
       i++;
       (*sl).newptr++;
       if(i>MAXSIZE-1) break;
       scanf("%d",&j);
   }
   (*sl).nodes[i].link=-1; //此处应为i,而不是i+1,否则会丢掉一个数据.


}

int find(slinklist sl,datatype x)  //按值查找
{
    int p=sl.nodes[0].link;
    while(p!=-1)
        if(sl.nodes[p].data!=x)
            p=sl.nodes[p].link;
        else
            break;
        return p;
}

int locate(slinklist sl,int i)     //按结点查找
{
    int j=0,p=sl.nodes[0].link;
    if(i<0)
        return -1;
  
    while(p!=-1&&j<i)
    {
        p=sl.nodes[p].link;
        j++;
    }
    if(i==0)
        return 0;
    return p;

}

int insert(slinklist sl,int i,datatype x)     //在静态链表第I个结点处插入一个新结点
{
    int p=locate(sl,i-1);       //查找i之前的一个结点
    int q=sl.newptr;
    if(p=-1)
        return 0;//新结点
         
    sl.newptr=sl.nodes[sl.newptr].link;
    sl.nodes[q].data=x;
    sl.nodes[q].link=sl.nodes[p].link;
    sl.nodes[p].link=q;
    return 1;
}

//移除
int remove_l(slinklist sl,int i)
{
    int p=locate(sl,i-1);
    int q=sl.nodes[p].link;
    if(p==-1)
        return 0;

    sl.nodes[p].link=sl.nodes[q].link;
    sl.nodes[q].link=sl.newptr;
    sl.newptr=q;
    return 1;
}

void output(slinklist sl)
{
    int i,q;
    i=0;q=1;
    printf("输出数据:\n");
  
    while(sl.nodes[q].link!=-1)
    {
        printf("%d\t",sl.nodes[q].data);
        q=sl.nodes[q].link;
        i++;
      
        if(i%5==0)
            printf("\n");
    }


}





int main()
{
    initlist(&a);
    ceratlist(&a);
    output(a);
    getch();
}

将链表的传递改为地址传递就可以了。只给你修改了初始化和创建,其他的自己改正吧。
2012-10-19 11:12
海莲
Rank: 1
等 级:新手上路
帖 子:19
专家分:5
注 册:2012-9-27
收藏
得分:0 
回复 5楼 babylco0
谢谢,改出来了
2012-10-22 20:24
快速回复:静态链表的输出有点问题,大家给看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025306 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved