| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 600 人关注过本帖
标题:链表的合并与排序问题
只看楼主 加入收藏
血色龙
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-4-23
收藏
 问题点数:0 回复次数:2 
链表的合并与排序问题
//书上说可以按升序排序,但是我又没有抄错,所以确定是书上错了,这个程序只能合并链表,无法实现排序
#include "stdio.h"
#include "malloc.h"
#define LEN sizeof(struct student)
struct student   //定义表头
{long num;
 int score;
 struct student *next;
};
struct student lista,listb;
int n,sum=0;
void main()
{struct student *creat(void);  //声明函数
 struct student *insert(struct student *,struct student *);  //声明函数
 void print(struct student *);  //声明函数
 struct student *ahead,*bhead,*abh;
 printf("input list a: \n");
 ahead=creat();  //用creat函数输入链表,存入ahead中
 sum=sum+n;  //计算有多少个人的数据
 printf("input list b: \n");
 bhead=creat();   //用creat函数输入链表,存入bhead中
 sum=sum+n;   //计算有多少个人的数据
 abh=insert(ahead,bhead);  ////用insert函数将两个表合并。书上说这里还有排序,但是我觉得没有
 print(abh);  //用print函数输出合并后的链表
}
struct student *creat(void)
{struct student *p1,*p2,*head;  //定义变量
 n=0;
 p1=p2=(struct student *)malloc(LEN);  //分配足够的空间给链表,p1,p2指向首地址
 printf("input number & scores of student : \n");
 printf("if number is 0,stop inputing. \n");
 scanf("%ld,%d",&p1->num,&p1->score);  //输入数据
 head=NULL;  //表头为空
 while (p1->num!=0)  //当输入数不为0时循环
   {n=n+1;  //计算人数
       if(n==1)  //如果是第一个元素,则head=p1
         head=p1;
       else
         p2->next=p1;  //如果不是第一个元素则p1指向下一个结点
       p2=p1;
       p1=(struct student *)malloc(LEN);  //再次分配一个内存空间    
       scanf("%ld,%d",&p1->num,&p1->score);  //输入数据给p1
   }
 p2->next=NULL;  //循环结束,最后加NULL结束整个链表的输入
 return(head);  //返回head
}
struct student *insert(struct student *ah,struct student *bh)
{struct student *pa1,*pa2,*pb1,*pb2;
 pa2=pa1=ah;  //pa1,pa2指向表a的首地址
 pb2=pb1=bh;  //同上
 do
 {while ((pb1->num>pa1->num)&&(pa1->next!=NULL))  
     {pa2=pa1;
      pa1=pa1->next;  //当条件成立,pa1指向下一个地址
     }
  if(pb1->num<=pa1->num)
    {if(ah==pa1)  //这里不怎么懂,应该是如果pa1指向a的表头,那么pb1也指向a的表头吧
        ah=pb1;
     else pa2->next=pb1;  
       pb1=pb1->next;
     pb2->next=pa1;
     pa2=pb2;
    pb2=pb1;
    }
 }
 while ((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL));
 if((pb1!=NULL)&&(pb1->num>pa1->num)&&(pa1->next==NULL))
   pa1->next=pb1;
 return(ah);
}
void print(struct student *head)  //输出整个合并后的链表
{struct student *p;
 printf("\nThere are %d record: \n",sum);
 p=head;
 if(p!=NULL)  
   do
     {printf("%ld,%d\n",p->num,p->score);
      p=p->next;
     }
   while (p!=NULL);
}


注释是我自己写的,仅供参考,可能有点不对~~~~~~~~~
问题是无法实现排序问题,希望各位帮忙改一下,谢谢
搜索更多相关主题的帖子: 链表 
2008-10-25 00:07
甲鱼
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-10-4
收藏
得分:0 
要把main函数移到最后,还有好像没有NULL的定义,在一开始就要有了
2008-10-25 00:10
血色龙
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-4-23
收藏
得分:0 
链表
这个没有问题,main函数在那里都是可以的,因为在调用函数的时候他会自己在程序中找需要的自定义函数,至于NULL,在头文件malloc里面就有说明,所以不需要重新定义
2008-10-25 00:13
快速回复:链表的合并与排序问题
数据加载中...
 
   



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

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