问答1 问答5 问答50 问答500 问答1000

C语言输入两组各十个数据,存入链表并排序输出,最后归并入第三个链表...

提问网友 发布时间:2025-02-13 11:24
声明声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:1656858193@qq.com
1个回答
热心网友 回答时间:2025-03-18 17:58
#include<stdio.h>
#include<malloc.h>
//#define NULL 0
//这里有两个问题,1.此处没有 ;号
//2 . 不用定义NULL 为0
//你为啥将一个整型0赋给一个指针呢
//应该将这句注释掉,因为NULL本来
//就代表空指针,不要画蛇添足
struct numb
{
int data;
struct numb *next;
};

struct numb *creat()
{
struct numb *head,*s,*p;
int i;
head=s=p=NULL;
p=(struct numb *)malloc(sizeof(struct numb));
printf("please input 10 numbers\n");
for(i=0;i<10;i++)
{
s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
if(i==0) head=p;
scanf("%d",&p->data);
p=p->next;
if(i==9) p->next=NULL;
} //此处也没有 ; 号
return head;
}
void print(struct numb *head)
{
struct numb *current;
int i;
printf("The result are:\n");
current=head;
for(i=0;i<10;i++)
{
printf("%3d\t",current->data); //此处注意修改,不是(*current)
current=current->next;
}
printf("\n");
}
void sort(struct numb *head)
{
struct numb *p,*q;
int temp,i,j;

//下面排序的思想是每次让j 循环中的所有元素
//和当前的第i个元素比较,若果比第i个元素小就
//交换第j个和第i个元素,这样是按照从小到大的
//顺序排,从小到大的方法雷同
p=head;
for(i=0;i<9;i++)
{
//p=q=head;
//q=q->next;
q=p;
for(j=i+1;j<10;j++)
{
q=q->next;

if(p->data > q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
p=p->next;
}
//上面的排序方法比较好理解
//你的代码中每次进行外层的for循环时,
//p 和q 的值都是从数组的开头位置进行排序的,
//这就有问题了,应该每进行一次外层for循环,
//p 和q 的值从上一次循环的位置开始,而不是从头
//重新开始,希望这样解释你能理解
}
struct numb *combin(struct numb *head1,struct numb *head2)
{
//我给的归并函数是在前两个链表已经
//排好序的基础上,每次选择两个链表中的
//比较小的值归入第三次链表,这样依次归并下去
struct numb *Head,*p,*s,*fir,*sec;
int flag=1,temp;

Head=(struct numb *)malloc(sizeof(struct numb));
p=Head;

fir=head1,sec=head2;
while(flag)
{
if(fir==NULL && sec==NULL) //如果两个链表中的元素都归并完了,
{ //就退出
flag=0;
}
else if(fir==NULL && sec!=NULL) //如果第一个链表归并完了,第二个
{ //链表还有元素,就将第二个的元素
p->data=sec->data; //之间放到第三个链表中
sec=sec->next;

}
else if(fir!=NULL && sec==NULL) //如果第二个链表归并完了,第一个
{ //链表还有元素,就将第一个的元素
p->data=fir->data; //之间放到第三个链表中
fir=fir->next;
}
else
{
if(fir->data < sec->data)
{
p->data=fir->data;
fir=fir->next;
}
else
{
p->data=sec->data;
sec=sec->next;
}
}

s=(struct numb *)malloc(sizeof(struct numb));
p->next=s;
p=s;
}

return Head;
}
void printlen(struct numb *head) //注意排序后数组元素就不止10个了,在
{ //这里我采用偷懒的方法,有复制了一份
struct numb *current;
int i;
printf("The result are:\n");
current=head;
for(i=0;i<20;i++)
{
printf("%3d\t",current->data); //此处注意修改,不是(*current)
current=current->next;
}
printf("\n");
}
int main()
{
struct numb *pHead1,*pHead2; //注意phead声明的类型,不是int

struct numb *pHead3;

pHead1=creat();
pHead2=creat();
sort(pHead1);
sort(pHead2);
print(pHead1);

print(pHead2);

pHead3=combin(pHead1,pHead2);
printlen(pHead3);

return 0;

}

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

新奇制冷怎么样 海容冷链(603187):商用冷柜龙头! 商用冷柜有哪些公司 中国商厨展示柜十大品牌? 中国有几家生产大型超市冷柜的? 只有气球如何装饰 气球印字概述 赤小豆和薏米的功效有哪些 直流电动机简述 发电机分为几大类 埃及金字塔的简介埃及金字塔资料 6代高尔夫gti停产了吗 6代高尔夫gti停产了吗多少钱 兴业银行无贷户客户经理怎么样 ...招聘零售业务客户经理,这个职位做什么?工作好做么?不是正式员工有多... 好消息!2024年新疆试管婴儿纳入医保(附报销范围) 2024年哪些地区试管婴儿纳入国家医保? 2024年4月1号起,山东辅助生殖试管婴儿纳入医保(附报销范围) 试管可以报销医保吗 win7电脑如何安装字体win7如何安装字体win7安装字体的两种方法_百度知 ... win7系统字体文件夹在哪里 win7字体安装在哪个文件夹 那位大神会用scratch做C语言里的冒泡排序和链表?求帮助! 求解C语言中建立一个对链表按照学号进行排序的问题 重婚罪怎么定罪判刑 重婚判刑的标准 重婚罪怎么判刑?, 女孩子叫我大哥什么意思 女孩叫大哥的说明什么 邮政储蓄银行ATM机异地跨行转账到建行需要多长时间? 大金u8故障怎么处理 手机录制一个小时视频要占多少内存 荒野之息攻略人马塞尔达传说荒野之息人马多久刷新 塞尔达传说荒野之息莱尼尔位置莱尼尔在哪 塞尔达传说荒野之息23只人马在哪全部人马位置 抚养费不给怎么执行 不给抚养费的后果有哪些 不给孩子抚养费或不付抚养费该如何处理 dnf巴卡尔团本爆龙王巴卡尔怎么打爆龙王巴卡尔攻略 传奇霸业武器怎么发光 DNF巴卡尔困难模式怎么打详细打法攻略分享 怎么判断自己是不是得了心脏病