| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 348 人关注过本帖
标题:建立两个连表,合并,并按学好从小到大输出,有错,但找不出来,请各位看看
收藏  订阅  推荐  打印 
llp108
Rank: 2
等级:注册会员
帖子:53
积分:684
注册:2007-11-15
建立两个连表,合并,并按学好从小到大输出,有错,但找不出来,请各位看看

错误出现在排序中用红色表示的语句上,当我把该语句删除程序可执行,但是只能排前两个接点,达不到从小到大的效果,如果加上 程序执行有错,麻烦各位看一下 谢谢!!
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define LEN sizeof(struct student)
#define NUL 0
struct student
{
    char num[5];
    char name[20];
    float score;
    struct student*next;
};
main()
{
    struct student *creat(struct student*,int);
    struct student *insert(struct student*,struct student*);
    void paixu(struct student*,int);  //对连表进行排序
    void  print(struct student*);
    struct student *pa,*pb,*pc,a,b;
    int na,nb,nc;
    pa=&a;
    pb=&b;
    printf("请分别输入要建两个链表的结点个数:\n");
    printf("第一个链表结点数:");
    scanf("%d",&na);
    pa=creat(pa,na);
    printf("第二个链表结点数:");
    scanf("%d",&nb);
    pb=creat(pb,nb);
    pc=insert(pa,pb);
    nc=na+nb;
    paixu(pc,nc);
    print(pc);
}
struct student *creat(struct student*p,int n)
{
    struct student *p1,*p2;
    int N=1;
    if(n==0)
    p=NUL;
    else
    {p1=p;
    do
     {printf("第%d个学生:\n",N);
      printf("学号:");
      scanf("%s",&p1->num);
      printf("姓名:");
      scanf("%s",&p1->name);
      printf("成绩:");
      scanf("%f",&p1->score);
      if(n==1)
         p->next=NUL;
      else
        {p2=p1;
         p1=(struct student*)malloc(LEN);
         p2->next=p1;
        }
      N++;} while(N<=n);
     if(n!=1)
      p2->next=NUL;}
     return(p);
}         
void paixu(struct student*p,int n)
{
    struct student temp,*head;
    int i,j;
    head=p;
    for(i=0;i<n-1;i++)
       for(j-0;j<n-i;j++)
        {if(strcmp(p->num,(p->next)->num)>0)
           {strcpy(temp.num,p->num);
            strcpy(p->num,(p->next)->num);
            strcpy((p->next)->num,temp.num);
            strcpy(temp.name,p->name);
            strcpy(p->name,(p->next)->name);
            strcpy((p->next)->name,temp.name);
            temp.score=p->score;
            p->score=(p->next)->score;
            (p->next)->score=temp.score;
           }
          p=p->next;
         }
    p=head; //在下一伦开始时使p回到head//   
}
void print(struct student*p)
{
    printf("排序好的连表是:\n");
    printf("学号        姓名        成绩\n");
    do
          {printf("%5s%10s%10.2f\n",p->num,p->name,p->score);
           p=p->next;}while(p!=NUL);
}
struct student*insert(struct student*p1,struct student*p2)
{
    struct student *head;
    head=p1;
    while(p1->next!=NUL)
       p1=p1->next;
    p1->next=p2;
    return(head);
}
搜索更多相关主题的帖子: 从小到大  输出  
2008-1-8 21:01
zbqf109
Rank: 3Rank: 3
等级:中级会员
帖子:289
积分:3134
注册:2006-12-31

呜呼哀哉

坚决不跟用TC的人打交道!
2008-1-8 21:57
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.056607 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved