| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1143 人关注过本帖
标题:[求助]学数据结构写了个小程序,但是怎么都调不过,求解
取消只看楼主 加入收藏
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:9 
[求助]学数据结构写了个小程序,但是怎么都调不过,求解
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Student{
    int id;
    int age;
    char name[20];
    int grade;
    char sex;
    int index;
    struct Student * sNext;
}stu,*pstu;
void init(pstu pHead,pstu pTail);
void input(pstu pHead,pstu pTail);

void traverse(pstu pHead);



int main(){
    stu sHead;
    stu sTail;
   
    init(&sHead,&sTail);
    input(&sHead,&sTail);
    traverse(&sHead);//一到这个遍历函数,程序就挂了,求解?
    return 0;
}
//构造头结点
void init(pstu pHead,pstu pTail){
    pHead=(pstu)malloc(sizeof(stu));
    pTail=pHead;
    pHead->index=0;
    pHead->sNext=NULL;
}

//添加
void input(pstu pHead,pstu pTail){
    pstu  p=(pstu)malloc(sizeof(stu));
    printf("请输入姓名:");
    scanf("%s",p->name);
    printf("请输入学号:");
    scanf("%d",&p->id);
    printf("请输入年龄:");
    scanf("%d",&p->age);
    printf("请输入成绩:");
    scanf("%d",&p->grade);

    p->index=pTail->index+1;
    pTail->sNext=p;
    pTail=p;
    pTail->sNext=NULL;
   
}
//遍历
void traverse(pstu pHead){
    if(pHead==NULL){
        printf("你还没有存储任何学生信息!!");
        return;
    }
    pstu p;
    p=pHead->sNext;

    while(p!=NULL){
        printf("编号:%d||姓名:%s||学号:%d||年龄:%d||成绩:%d",
            p->index,p->name,p->id,p->age,p->grade);
        p=p->sNext;
    }
    return;
}
搜索更多相关主题的帖子: return include 
2013-10-10 11:22
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
先自顶一个
2013-10-10 11:24
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 4楼 xufan
如果是要输入多个学生信息的话,就不能将尾节点放在添加的函数中去了吧,就是这样我才决定用一个头结点和一个尾节点进行传参的,而且我个人觉得话既然已经用指针来传参就没必要在返回值了
2013-10-10 12:33
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 3楼 heroinearth
可以用return,并没有返回值,也可以不用,用的话会很明白的就知道函数结束了,显得程序比较清晰
2013-10-10 12:35
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 9楼 qunxingw
pTail=pHead;///////////链表要有头结点联系起来。
这样子做的话,如果是只是这个程序还可以,但是要是输入多个学生信息的话,那么每一次都要把尾指针只向头结点?
我试过这个程序,确实如果没有这句话,程序会挂掉,我很奇怪,在创建头结点的函数中不是已经有这句话了么?
但是要是把这句加上,即是输入多个学生信息,也只是显示出最后一个。
2013-10-10 14:49
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 11楼 zhaogay
sTail 是stu 类型,我在函数中用的形参是指向stu 类型的指针变量,其实不用返回值,也已经能够改变sTail本身的值了吧

[ 本帖最后由 阿萨德179 于 2013-10-10 14:54 编辑 ]
2013-10-10 14:52
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 15楼 zhaogay
好像真的是这样的,我看了以前写的代码都是有一个返回值的,但是我一直觉得没有返回值,直接将main中的地址穿进去也可以,虽然现在我还是没有彻底明白到底是回事。我之前是认为将sTail,和sHead的地址穿进去,sTail和sHead的内容就会发生改变。
2013-10-10 20:35
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 18楼 zhaogay
我明白了,原来如此
2013-10-10 21:53
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 18楼 zhaogay
其实我想了一下,其实我觉得这个解释应该要这样:pHead接受了来自sHead的地址,但是因为pHead=malloc();所以这时候pHead就不在指向sHead的这块内存了,所以sHead的值根本没改变,这是才需要返回值将改变后的pHead 付给sHead.
2013-10-10 23:49
阿萨德179
Rank: 1
等 级:新手上路
帖 子:15
专家分:4
注 册:2013-10-10
收藏
得分:0 
回复 21楼 zhaogay
说的也是,stu类型的尾节点确实起不到什么用,我把代码变成这个样子,添加了一个遍历,将p定位到尾节点上,你还能用其他办法吗?
void input(stu* pHead){
     stu*  p;
     stu* pTail=pHead;

    p=(stu*)malloc(sizeof(stu));
   
    printf("请输入姓名:");
    scanf("%s",p->name);
    printf("请输入学号:");
    scanf("%d",&p->id);
    printf("请输入年龄:");
    scanf("%d",&p->age);
    printf("请输入成绩:");
    scanf("%d",&p->grade);
     while(pTail->sNext!=NULL){
        pTail=pTail->sNext;
     }
     pTail->sNext=p;
     p->index=pTail->index+1;
     p->sNext=NULL;
}
2013-10-11 09:00
快速回复:[求助]学数据结构写了个小程序,但是怎么都调不过,求解
数据加载中...
 
   



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

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