注册 登录
编程论坛 数据结构与算法

求救!数据结构!大一初学者(自学的)一段很简单的代码不知哪里有错?求学长和高人指点。

liman123 发布于 2012-10-06 21:16, 1377 次点击
下面一段代码。只是实现简单的链表输入输出咋会出问题呢?好像是scanf()有问题但又不知哪儿有错?望各位指点一下!#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
#define NULL 0
typedef struct student
{
    int num;
    int score;
    struct student *next;
}student;

student *creat_list(student *L)
{
    int i;
    student *p,*r;
    L=(student * )malloc(sizeof(student));
    L->next=NULL;
    r=L;
    for(i=0;i<MAXSIZE;i++)
    {
        p=(student *)malloc(sizeof(student));
         scanf("%d,%d",&p->num,&p->score);
        p->next=NULL;
        r->next=p;
        r=p;
    }
    return L;
}
void print_list(student *L)
{
    student *s;
    s=L->next;
    while(s->next!=NULL)
    {
        printf("%ld,%d",s->num,s->score);
        s++;
    }
}
void main()
{
    student *L,*q;
    L=NULL;
    printf("输入相关数据:\n");
    q=creat_list(L);
    printf("相关数据为:\n");
    print_list(q);
}
20 回复
#2
liman1232012-10-08 12:56
怎么了?没人回复?(是不是太简单了,不屑呀?)
#3
c7641934412012-10-08 16:54
什么?
#4
c7641934412012-10-08 17:42
输入数据时的指针有问题,地址之间传递有问题
#5
liman1232012-10-09 10:40
第四楼的能说具体点吗?
#6
k852186932012-10-09 22:48
程序代码:
void print_list(student *L)
{
    student *s;
    s=L->next;   
    while(s!=NULL)//while(s->next!=NULL)
    {
        printf("%ld,%d",s->num,s->score);
        s = s->next;//s++;
    }
}

輸入應該沒問題...
輸出應該有問題...
#7
爱闹的娃2012-10-10 10:46
6楼说的是正解,你将链表作为了数组在用,链表里面是移动的指针.......
#8
liman1232012-10-10 12:40
改了依然不行啊!几天前就改过来了,可是在电脑上还是运行部正常。输出的还是乱码,不知是不是初始化的问题。(哎!大一真难啊!)
#9
zhu2240392012-10-10 21:10
void print_list(student *L)
{
    student *s;
    s=L->next;    ---------------------》  这个地方的语句会导致 链表的表头 不会被输出在显示器上 应该成 s=L
    while(s->next!=NULL)    ---------->这个条件判定直接改成  s!=NULL
    {
        printf("%ld,%d",s->num,s->score);
        s++;   -----》这个地方要修改成 s=s->next
    }
}
#10
senpujituan2012-10-11 12:18
这样可以的:
程序代码:
void print_list(student *L)

 {
     student *s;
     s=L->next;
     while(s!=NULL)
     {
         printf("%ld,%d\n",s->num,s->score);
         s=s->next;
     }

 }
#11
liman1232012-10-11 12:55
9楼说的后两个错误我发帖后就发现了,并且也改过来了。可输出的还是乱码,在这个程序中头结点中没有数据,我觉得好像没有必要输出头结点。
#12
zhu2240392012-10-11 20:40
我编译的 怎么出结果了呢
#13
senpujituan2012-10-12 09:08
回复 9楼 zhu224039
你那个不行吧?他头结点都没赋值,怎么会有正确的输出呢?
#14
zzzzy2012-10-12 10:00
这里改为:
void print_list(student *L)
 {
     student *s;
     s=L->next;
     while(s)  //
     {
         printf("%ld,%d\n",s->num,s->score);
         s=s->next;     //改
     }
 }
前面6楼的也是正确的,10楼的改对地方,但有点小问题

#15
zzzzy2012-10-12 10:03
说错了,是9楼的问题,不是10楼的,10楼的也是对的,结果已经运行,如果你运行不出来,可能是你的软件有问题
#16
liman1232012-10-12 13:10
为什么,要将“student *s=NULL;”改成“student *s;”呢?
#17
liman1232012-10-13 11:48
为什么要将“student *s=NULL;”改成“student *s”呢?
#18
nikobelic2012-10-14 21:19
楼主解决了么?你大一就学数据结构?那C是同时学的?我现在大二 刚学数据  也觉得比较费劲  但是多动手写代码还是有效果的。多多交流吧!加油!↖(^ω^)↗
#19
liman1232012-10-14 22:07
C我暑假自学了,多多交流,多多指教。可是为什么student *S=NULL要改成student *s啊!急急急!急急急急!
#20
努力学习ing2012-10-18 11:14
你是要进行输入输出,所以我建议你student *creat_list(student *L)最好不要带形参,带了也可以。
你在main()函数中对L已经进行了定义,那么运行时形参也就被初始化了,也就有了地址,在student *creat_list(student *L)中你又对L进行了动态申请,二者产生矛盾,所以程序会报错。我给你修改了下代码,可以运行的,细节处自己在处理下:
student *creat_list(student *L)
{
    int i;
    student *p,*tail=NULL;                   //tail表示尾指针
    L=NULL;                                  //因为链表未建立,所以对头指针和尾指针都进行了清零处理
    for(i=0;i<MAXSIZE;i++)
    {
        p=(student *)malloc(sizeof(student));
        scanf("%d%d",&p->num,&p->score);
        p->next=NULL;
        if(L==NULL)
            L= p;
        else
            tail->next=p;
        tail=p;  
    }
    return L;
}
void print_list(student *L)
{
    student *s=L;
    while(s)
    {
        printf("%ld,%d\n",s->num,s->score);
        s=s->next;
    }
}


[ 本帖最后由 努力学习ing 于 2012-10-18 13:18 编辑 ]
#21
liman1232012-10-18 22:56
多谢多谢
1