本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
用久了比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代码
输入样例:
1
2
3
4
53 1 3 5 5 2 4 6 8 10
输出样例:
1
2
31 2 3 4 5 6 8 10 NULL NULL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 #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内容请搜索靠谱客的其他文章。
发表评论 取消回复