概述
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
用久了比C更高级的语言感觉C才是万物本源,C/C++学好了才能打遍天下无敌手
这道题的指针又折磨了我很久,不过我也对指针有了2点更进一步的认知(做题一定要仔细认真看链表有没有空的头结点)
1.函数形参是指针类型时,其实也并未直接是使用实参传来的指针进行操作,而是自动重新malloc了一个新指针出来,用新指针指向形参指向的那一块变量,所以说如这道题的代码这么写,merge函数里面使用L1,L2往下遍历链表,(按照sample)这就使得这个函数作用域里的L1最终指向NULL,而指针L2最终指向数字6,但是main函数里面L1,L2指针位置仍然没有变,仍然都指向两个链表的头结点(),所以下面的print函数输出的仍然是链表数字序列而不是NULL。所以这道题应该在题目内部设置一个新指针p1,p2用来进行链表合成,L1,L2两个系统自动创建的指针(在当前函数作用域内)仍旧指向main函数里面的两个链表的头结点,最后在merge函数里面L1->next=NULL进行把两个原始链表置空
2.指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。如:*pointer_1=100;//pointer_1 是指针变量,100是整数,不合法。*p = 1,表示将1赋值给p 所指的变量或地址空间,在这步上面肯定有*p的初始化或已赋地址。不然你直接这样写肯定是错的。
假设:int *p;
*p = 7;
则编译器(vs2008)会提示The variable 'p' is being used without being initialized.即使用了未初始化的变量p。
由于p是指向7所在的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。
int k;
int *p;
p = &k; //给p赋值
*p = 7; //给p所指向的内存赋值,即k= 7
所以这种写法必须要避免,devc++并不会报错,注意好变量声明和初始化(赋值时分配内存空间),所以这样的值一定是野值
下面是AC代码
输入样例:
3
1 3 5
5
2 4 6 8 10
输出样例:
1 2 3 4 5 6 8 10
NULL
NULL
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 (也就是说提交的时候可以不考虑,不过还是要写的!) */
void Print( List L ); /* 细节在此不表;空链表将输出NULL (同上)*/
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}
/* 你的代码将被嵌在这里 */
List Read()
{
int n;
scanf("%d",&n);
List L=(List)malloc(sizeof(PtrToNode)); ///申请一个头结点
L->Next = NULL; ///头指针为空
if(n) ///当n不是0时
{
List r=L; ///r是一个中间变量的节点
for(int i=0;i<n;i++)
{
List p=(List)malloc(sizeof(struct Node));
scanf("%d",&(p->Data)); ///尾插法
r->Next = p;
r = p;
}
r->Next = NULL;
}
return L;
}
void Print( List L )
{
List p=L->Next;
if(p)
{
List r;
r = L;
while(r->Next)
{
r = r->Next;
printf("%d ",r->Data);
}
}
else
{
printf("NULL");
}
printf("n");
}
List Merge(List L1,List L2)//算法工程师
{
List bupt=(List)malloc(sizeof(struct Node));
List L=bupt;
bupt->Next=NULL;
List P1=L1->Next;
List P2=L2->Next;
while(P1&&P2)
{
if( P1->Data<=P2->Data)
{
List newnode=(List)malloc(sizeof(struct Node));
newnode->Data=P1->Data;
bupt->Next=newnode;
P1=P1->Next;
bupt=newnode;
}
else
{
List newnode=(List)malloc(sizeof(struct Node));
newnode->Data=P2->Data;
bupt->Next=newnode;
P2=P2->Next;
bupt=newnode;
}
}
bupt->Next= P2?P2:P1;
L1->Next=NULL;
L2->Next=NULL;
return L;
}
最后
以上就是眯眯眼未来为你收集整理的02-线性结构1 两个有序链表序列的合并 (15 分)的全部内容,希望文章能够帮你解决02-线性结构1 两个有序链表序列的合并 (15 分)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复