C语言两个链表连接简单问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言两个链表连接简单问题相关的知识,希望对你有一定的参考价值。

# include<stdio.h>
# include<malloc.h>
struct student
int data;
struct student *next;
;
typedef struct student node;
main()
node *head1,*head2,*r1,*r2;
int num1,num2;
r1=(node *)malloc(sizeof(node));
head1=r1;
printf("第一个链表输入");
scanf("%d",&num1);
while(num1!=-1)
r1->data=num1;
r1->next=(node *)malloc(sizeof(node));
r1=r1->next;
scanf("%d",&num1);


r2=(node *)malloc(sizeof(node));
head2=r2;
printf("第二个链表输入");
scanf("%d",&num2);
while(num2!=-1)
r2->data=num2;
r2->next=(node *)malloc(sizeof(node));
r2=r2->next;
scanf("%d",&num2);

r1->next=NULL;
r2->next=NULL;
r1->next=head2;
r1=head1;
printf("两个链表连接后;");
while(r1->next!=NULL)
printf("->%d",r1->data);
r1=r1->next;

printf("\n");

为什么中间会出现个垃圾值。这是head2头指针的数据域里面的垃圾h值么。请相信讲解下原理和流程是什么。 谢谢高手了,我实在想不出来怎么搞得。脑袋太笨了。

我感觉因为你在输入值一个值后,先把这个值给当前链表的节点,然后再在当前节点的后一个位置添加一个新建的节点(随机值)。比如说你输入-1之后,r1仍然指向一个新建的随机值节点,你只是将这个节点的next设置成了NULL,但是这个节点的值是随机的,所以中间出现了(也就是多了一个)垃圾值。即代码的问题出现在这里:
while(num1!=-1)
r1->data=num1;
r1->next=(node *)malloc(sizeof(node));
r1=r1->next;
scanf("%d",&num1);
参考技术A head2 本身就是一个没有数值存储的节点,仅仅作为“头”的作用。

你试试
r1->next = head2
改成r1->next = head2->next;

C语言:已有a,b两个链表,每个链表中的节点包括学号,成绩。要求把两个链表合并,按学号的升序排列

//(未完成)已有a,b两个链表,每个链表中的节点包括学号,成绩。要求把两个链表合并,按学号的升序排列
#include<stdio.h>
#define NULL 0
struct student

long num;
float score;
struct student * next;
;
struct student a[5]=

1005,10.23,&a[1],
1004,10.54,&a[2],
1003,11.55,&a[3],
1002,12.32,&a[4],
1001,15.65,NULL
;
struct student b[5]=

2005,11.23,&b[1],
2004,12.54,&b[2],
2003,16.55,&b[3],
2002,14.32,&b[4],
2001,17.65,NULL
;
void print(struct student * head)//打印链表的函数

struct student * p;
p=head;
if(head==NULL)
else
do
printf("%ld %f \n",p->num,p->score);
p=p->next;
while(p!=NULL);


void * sx(struct student * head)//升序函数,返回值是head的地址。将所有的节点按升序排列。

/*
这里是需要编写升序程序的代码区域,我不会。你帮帮我。谢谢!
*/
return (head);

void main()

a[4].next=&b[0];//将两个链表先连接起来
struct student * head;
head=&a[0];
print(head);
printf("num 按升序排列之后的输出结果是 :\n");
head=sx(head);//将经过升序排列之后的节点链表的首地址,赋值给head
print(head);//打印升序之后的链表

参考技术A struct student* sx(struct student * head)
// 用递归,每次找出原链表中学号最小的元素,插入到新链表的后面。
struct student *cursor, *first, *prev, *min;
first = NULL;

if (head == NULL)
return NULL;

for (cursor = min = head; cursor->next != NULL; cursor = cursor->next)

if (cursor->next->num < min->num)

prev = cursor;
min = cursor->next;



first = min;

if (min == head)
head = head->next;
else
prev->next = min->next;

first->next = sx(head);

return first;

本回答被提问者采纳

以上是关于C语言两个链表连接简单问题的主要内容,如果未能解决你的问题,请参考以下文章

[ 数据结构--C语言 ] 无头单向非循环链表的简单实现(单链表)

连接两个链表的实现

02-线性结构1 两个有序链表序列的合并

c语言有序链表合并,我找不到问题所在,求纠错!!

c语言程序链表问题

C语言实现双向链表