| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 590 人关注过本帖
标题:关于双向链表的问题,编译通过,运行就像进入了死循环,求指点
只看楼主 加入收藏
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:6 
关于双向链表的问题,编译通过,运行就像进入了死循环,求指点
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
    int num;
    char name[10];
    float score[3];
    float total;
    struct student *next,*prior;
}DLNode,*DLinkList;

//建立链表
DLinkList Creat_DLinkList()
{
    int x;
    char y[10];
    float s[3];
    DLinkList DL=NULL;
    DLNode *p=NULL,*q=NULL;
    DL=( DLNode*)malloc(sizeof( DLNode));
    if(DL==NULL)
        return 0;
    q=DL;
    DL->next=NULL;
    DL->prior=NULL;
    printf("\nPlease enter students' information:\n");
    scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
    while(x!=0)
    {
        int i;
        p=( DLNode*)malloc(sizeof( DLNode));
        p->num=x;
        strcpy(p->name,y);   
        for(i=0;i<3;i++)
            p->score[i]=s[i];
        p->total=p->score[0]+p->score[1]+p->score[2];
        q->next=p;
        p->prior=q;
        p->next=DL;
        q=p;
        scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
    }
    DL->prior=q;
    return q;
}

//查找
int search(DLinkList r,int n)
{
    DLNode *p,*h;
    h=r->next;
    p=h->next;
    while(p!=h)
    {
        if(p->num==n)
            return 1;
        p=p->next;
    }
    return 0;
}

//添加
DLinkList add(DLinkList r)
{
    int x;
    char y[10];
    float s[3];
    DLNode *h=r->next,*p=NULL;
    p=(DLNode*)malloc(sizeof( DLNode));
    printf("\nPlease enter students' information:\n");
    scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
    while(x!=0)
    {
        int i;
        p=( DLNode*)malloc(sizeof( DLNode));
        p->num=x;
        strcpy(p->name,y);   
        for(i=0;i<3;i++)
            p->score[i]=s[i];
        p->total=p->score[0]+p->score[1]+p->score[2];
        p->prior=r;
        r->next=p;
        p->next=h;
        h->prior=p;
        r=p;
        scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
    }
    return r;
}

//删除
void deletce(DLinkList r)
{
    DLNode *h=r->next;
    DLNode *p=h->next;
    DLNode *q=NULL;
    while(p!=h)
    {
        q=p->next;
        while(q!=h)
        {
            if(!strcmp(q->name,p->name))
            {
                q->prior->next=q->next;
                q->next->prior=q->prior;
                free(q);
            }
            q=q->next;
        }
        p=p->next;
    }   
}

//修改
int modify(DLinkList r,int n)
{
    float s[3];
    int i;
    DLNode *h=r->next;
    DLNode *p=h->next;
    while(p!=h)
    {
        if(p->num==n)
        {
            printf("\nPlease enter new score:\n");
            scanf("%f%f%f",&s[0],&s[1],&s[2]);
            for(i=0;i<3;i++)
                p->score[i]=s[i];
            p->total=p->score[0]+p->score[1]+p->score[2];
            break;        
        }
        p=p->next;
    }
    if(p==h)
        return 0;
    else
        return 1;
}

//排序
DLinkList sort(DLinkList r)
{
    DLNode *t=NULL,*s=NULL;
    DLNode *h=r->next;
    DLNode *p=h->next;
    DLNode *q=NULL;
    while(p!=h)
    {
        q=h->next->next;
        while(q!=h)
        {
            t=q->prior;
            if(t->total<q->total)
            {
                s=t->prior;
                t->next=q->next;
                q->next->prior=t;
                t->prior=q;
                q->next=t;        
                q->prior=s;
                s->next=q;
                q=t;
            }
            q=q->next;
        }
        p=p->next;
    }
   
    return h->prior;
}

//输出
void print_DLinkList(DLinkList r)
{
    int i=0;
    DLNode *p,*h;
    h=r->next;
    p=h->next;
    while(p!=h)
    {
        printf("number:%3d\tname:%s\tscore:%5.2f\t%5.2f\t%5.2f\ttotal:%5.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->total);
        p=p->next;
    }
}

//释放内存
void destory(DLinkList r)
{
    DLNode *h,*p,*t=NULL;
    h=r->next;
    p=h->next;
    while(p!=h)
    {
        t=p->next;
        free(p);
        p=t;
    }
    free(h);
}

int main()
{
    DLinkList r;
    int x,n,k;
    r=Creat_DLinkList();
    print_DLinkList(r);
    printf("\nChoose what you want:\n");
    printf("1:Search information:\n");
    printf("2:Add information:\n");
    printf("3:Delete same name:\n");
    printf("4:Modify score:\n");
    printf("5:Sort degrdation:\n");
    scanf("%d",&x);
    switch(x)
    {
        case 1: printf("\nPlease enter a number:");
            scanf("%d",&n);
            k=search(r,n);
            if(k)
                print_DLinkList(r);
            else
                printf("\nerror!!!\n");
            break;   
        case 2: r=add(r);
            print_DLinkList(r);
            break;
        case 3: deletce(r);
            print_DLinkList(r);
            break;
        case 4: printf("\nPlease enter a number:");
            scanf("%d",&n);
            k=modify(r,n);
            if(k)
                print_DLinkList(r);
            else
                printf("\nNot found!!!\n");
            break;
        case 5: r=sort(r);
            print_DLinkList(r);
            break;
        default:printf("\nEnter error!!!\n");
    }   

    destory(r);
    return 0;
}
搜索更多相关主题的帖子: return include 
2014-04-16 22:33
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
估计是逻辑错误,俺已经大脑短路了,求指点

走向光明的菜鸟学生,励志成为新一代程序猿
2014-04-16 22:34
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
求高人啊

走向光明的菜鸟学生,励志成为新一代程序猿
2014-04-16 23:31
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:1 
先说一下你是想用双向链表实现什么功能,然后说下自己的思路

大家一般不会喜欢自己读你的代码然后分析思路的。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-04-17 01:03
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
不好意思,说得不够清楚,我这是一个双向链表的学生管理系统,编译通过了,可是运行的时候可以一直输入数据没有任何反应, while(x!=0)这条语句就是当学号为0时结束输入,可是程序还是可以输入数据,所以我觉得我是逻辑上有问题,请大家帮我看看,“建立链表”的时候有没有出错,其他的应该都没什么问题,就卡在接收用户端输入数据那一块了(//建立链表),谢谢大家

走向光明的菜鸟学生,励志成为新一代程序猿
2014-04-17 22:33
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:9 
试了一下建立和输出链表没有问题。估计你是输入数据的时候,没有注意到:输入学号。0时结束时,一组数据必须完整,姓名、3个成绩必须有值,如,结束输入为:0 ff 1 1 1。如果输入不完整,程序等你输入下面的值,光标闪烁,就像死循环一样。你试试,切记:输入时每组数据都要完整。
2014-04-18 07:21
l3456
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:80
专家分:133
注 册:2014-4-16
收藏
得分:0 
回复 6 楼 ying8501
非常感谢

走向光明的菜鸟学生,励志成为新一代程序猿
2014-04-18 17:33
快速回复:关于双向链表的问题,编译通过,运行就像进入了死循环,求指点
数据加载中...
 
   



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

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