| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 358 人关注过本帖
标题:求教一个链表问题!
只看楼主 加入收藏
zengboming
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-2-29
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
求教一个链表问题!
我写了一个学生管理系统的链表程序
函数几乎是按照书上写的
但是就是有问题
貌似每次函数调用时 head都等于NULL
我百思不得其解
我已经改了三天了,始终没有找出问题,特来此寻求大神帮助!
希望各位能帮我指出错误,并且帮我改正一下!
感激不尽!

下面是我的代码:

#include<stdio.h>
#include<stdlib.h>

void menu();

struct student
{
    long num;
    char name[20];
    float score;
};

struct intnode
{
    struct student stu;
    struct intnode *next;
};

void creat(struct intnode **head)         
{
    int n;
    struct intnode *p;
    printf("输入学生学号\n");
    scanf("%d",&n);
    while(n!=0)
    {
        p=(struct intnode *)malloc(sizeof(struct intnode));
        p->stu.num=n;
        printf("输入学生姓名\n");
        scanf("%s",p->stu.name);
        printf("输入学生成绩\n");
        scanf("%f",&p->stu.score);
        p->next=*head;
        *head=p;
        printf("输入学生学号 以0结束\n");
        scanf("%d",&n);
    }

        p=*head;
        while(p!=NULL)
        {
            n++;
            p=p->next;
        }
        printf("n=%d",n);
    printf("\n按回车键返回主菜单……\n");
    getchar();
    getchar();
    menu();
}

void sort(struct intnode *head,int n)
{
    int i,j;
    struct student temp;
    struct intnode *p1,*p2,*p;
    for(p1=head,i=0;i<n-1;i++,p1=p1->next)
        for(p2=p1->next,j=i+1;j<n;p2=p2->next,j++)
            if(p1->stu.score<p2->stu.score)
            {
                temp=p1->stu;
                p1->stu=p2->stu;
                p2->stu=temp;
            }
        p=head;
        while(p!=NULL)
        {
            printf("%l\t%s\t%f\n",p->stu.num,p->stu.name,p->stu.score);
            p=p->next;
        }
}

struct intnode * insert(intnode **head,float x)
{
    struct intnode *other,*last,*current;
    other=(struct intnode *)malloc(sizeof(struct intnode));
    other->stu.score=x;

    current=*head;
    while(x<other->stu.score&&current->next!=NULL)
    {
        last=current;
        current=current->next;
    }
   
    if(x>=current->stu.score)
        if(current==*head)
        {
            other->next=*head;
            *head=other;
        }
        else
        {
            other->next=current;
            last->next=other;
        }
    else
    {
        other->next=NULL;
        current->next=other;
    }
    return(other);
}

int delet(struct intnode **head,int x)
{
    struct intnode *p,*last;
    p=*head;
    while(x<p->stu.num&&p->next!=NULL)
    {
        last=p;
        p=p->next;
    }
    if(p->stu.num==x)
    {
        if(p==*head)
            *head=p->next;
        else
            last->next=p->next;
        free(p);
        return 1;
    }
    else return 0;
}


void main()
{
    menu();
}

void menu()
{
    system("cls");

    int k,n,t;
    float x;
    struct intnode *head;
    head=NULL;

    printf("**************************************\n");
    printf("           学生成绩系统               \n");
    printf("**************************************\n\n");
    printf("1、建立学生记录链表 并遍历学生链表\n");
    printf("2、将学生链表从高到低排序\n");
    printf("3、向链表中插入结点\n");
    printf("4、按指定学号删除结点\n\n");
    printf("请输入数字 选择功能\n");
    scanf("%d",&k);
    switch(k){   
        case 1:     printf("建立学生记录链表\n");
                    creat(&head);break;

        case 2:     printf("将学生链表从高到低排序\n");
                    sort(head,n);break;

        case 3:     printf("向链表中插入结点\n");
                    printf("输入学生成绩\n");
                    scanf("%f",&x);
                    insert(&head,x);break;

        case 4:     printf("按指定学号删除结点\n");
                    printf("输入删除学生学号\n");
                    scanf("%d",&t);
                    delet(&head,t);break;

        case 5:     printf("系统正在关闭\n");
                    system("pause");

        default:    printf("输入错误,请重新输入1-7的数字");
                    printf("\n按回车键返回主菜单……\n");
                    getchar();
                    getchar();
                    menu();
    }
    printf("\n按回车键返回主菜单……\n");
    getchar();
    getchar();
    menu();
}
搜索更多相关主题的帖子: head void include 链表程序 
2012-03-01 00:09
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:10 
我晕,这样的我帮你调了半天。我看了半天没有看出什么错误。
一步一步调试发现 你这个递归啊。
你开始的建的head 在递归新的函数中根本没有用啊。
他用重头开始了啊。
要么就不用递归,要么就设一个全局变量。

什么破书,靠 无语。。。

用心做一件事情就这么简单
2012-03-01 01:35
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
静态的也可以

用心做一件事情就这么简单
2012-03-01 12:05
zengboming
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-2-29
收藏
得分:0 
回复 2楼 小鱼儿c
这是递归?! 我怎么感觉不就是普通的函数调用嘛。。。。
设全局变量啊 我刚试了 还是不行。。。。 无奈了。。
2012-03-01 12:07
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:10 
套while循环去   这样递归等于重复创建链表

看来你还是不清楚你的程序到底在内存中是什么样子的

                                         
===========深入<----------------->浅出============
2012-03-01 12:11
zengboming
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-2-29
收藏
得分:0 
回复 5楼 laoyang103
怎样改不是递归。。。我真心没发现我写的是递归。。。
调用的函数我是仿照书上写的
主函数 和菜单是我自己写的
说实话。。。链表真心听得稀里糊涂的。。。
是不是创建的那个函数有问题?
2012-03-01 12:15
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
回复 4楼 zengboming
全局是可以的,不知道你怎么写的。 自己好好写吧。既然知道自己代码哪里错了就可以了。
链表怎么写 看看 c大学教程中的  写的简单 好看  适合链表没有懂的人 看

用心做一件事情就这么简单
2012-03-01 12:17
zengboming
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-2-29
收藏
得分:0 
回复 7楼 小鱼儿c
谢谢啦 我到时候借一本  好好研究研究!
2012-03-01 12:21
快速回复:求教一个链表问题!
数据加载中...
 
   



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

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