回 帖 发 新 帖 刷新版面

主题:求调教这程序(链表排序),他无限输出,

code=c]
#include<stdio.h>
#include<malloc.h>
#include <stdlib.h> 

typedef struct student 
{
    int mum;
    char name[20];
    int age;
    char sex[5];//w and M
//  int birthday[2];
//    char address[50];
//    int photo;
//    char Email[20];
    struct student *next;
}st;

int n;
//创建+输入 
st *creat(void)
{
    void scan(st *q);
    st *head;
    st *p1,*p2;
    n=0;
    p1=p2=(st *)malloc(sizeof(st));
    scan(p1);
    head=NULL;
    while(p1->mum!=0)
    {
        n=n+1;
        if(n==1)head=p1;
            else p2->next=p1;
            p2=p1;
            p1=(st *)malloc(sizeof(st));
            scan(p1);
    }
    p2->next=NULL;
    return(head);
}

void scan(st *q)
{
    printf("请输入学号\n");
    scanf("%d",&(*q).mum);
    fflush(stdin);
    if(q->mum!=0)
    {
    printf("请输入姓名\n"); 
    scanf("%s",(*q).name);
    fflush(stdin);
    printf("请输入年龄\n");
    scanf("%d",&(*q).age);
    fflush(stdin);
    printf("请输入性别\n");
    scanf("%s",(*q).sex);
    fflush(stdin);
/*    printf("请输入出生年月(年-月-日)");
    scanf("%d-%d-%d",(*q).birthday[0],(*q).birthday[1],(*q).birthday[2]);
    printf("请输入家庭住址");
    scanf("%f",(*q).address); 
    printf("请输入电话号码");
    scanf("%d",(*q).photo);
    printf("请输入E-mail");
    scanf("%f",(*q).Email); */
    }
}

//排序
st *paixu_mum(st *head)
{
    int i=0;
    st *p,*q,*t,*hl;
    hl=head->next;
    hl->next=NULL;
    while(hl!=NULL)
    {
        t=hl;
        hl=hl->next;
        p=head;
        q=head;
        while((t->mum>p->mum)&&(p->next!=NULL))//位置不对时 
            {
                q=p;
                p=p->next;
            }
            if(t->mum<=q->mum)//找到位置 
            {
                if(head==p)head=t;
                else q->next=t;
                t->next=p; 
            } 
            else
            {
                p->next=t;
                t->next=NULL;
            }        
    }
}  

//输出
void print(st *m)
{
    
    printf( "%4d  %4s    %2d   %2s\n",(*m).mum,(*m).name,(*m).age,(*m).sex);
}

void print1(st *head)
{
    
    st *k;
    k=head;
    printf("mum   name   age   sex\n");
    if(head!=NULL)
        do
        {
            print(k);
            k=k->next;
        }while(k!=NULL);
}


 

int main()
{
    st *head;
    int m;
    head=creat();
    print1(head);
//    charu(head);
//    print1(head);
//    del(head);
//    print1(head);
 //   check_mum(head);
 paixu_mum(head);
 
 print1(head);
}

主要是排序函数其他的都弄好,运行后编译无错但是无限输出,求高手帮看看,我搞了昨天一天了都没弄好

[[/code]

回复列表 (共4个回复)

沙发

我用dev c++编译的,没有你说无限输出的问题,你说的问题请提供相应的用例
其次指出一个小错误,你的程序里paixu这个函数是不能把头结点修改的结果传递回main函数的,原因是头结点这个指针本身是不可修改的,所以            if(t->mum<=q->mum)//找到位置 
            {
                if(head==p)head=t;
                else q->next=t;
                t->next=p; 
            } 
这里的head=t不会引起main里链表的相应变化的
第三,给个思路建议:为什么不照抄数组插入排序的简单双循环格式呢?你现在的循环我看着还是晕,不太好给你调……
第四,性别一般用char gender,如果想用char[]的话一定记住是char[6],否则的话如果你输入woman,%s格式输出的时候就停不下来了,因为没扫到应该有的\0(莫非你的无限输出是因为这个=。=)

板凳

额,我知道那排序写得很乱,所以求帮写一个单向链表排序的范例,加详细注释

3 楼


我知道那排序写得很乱,所以求高手写单向链表排序的范例,最好加有详细注解的。。。。

4 楼

百度一下,你就知道

我来回复

您尚未登录,请登录后再回复。点此登录或注册