马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
就比如在主函数中定义的指针La,Lb,Lc,如果初始化为空指针有什么风险//归并有序线性表之链式存储
#include <stdio.h>
#include<stdlib.h>
typedef struct Node *List;
typedef struct Node {
int data;
List next;
} node;
void CreateList_n(List &head, int n)//创建链表,采用尾插入法,首个结点不存储数据
{
int i = 0;
head = (List) malloc(sizeof(node));
head->next = NULL;
List tail = head;//始终指向尾结点
printf("请由小到大输入链表表的数据:\n");
while (i < n) {
List s = (List) malloc(sizeof(node));//申请新节点的内存
scanf("%d", &s->data);
tail->next = s;
tail = s;
i++;
}
tail->next = NULL;
}
void PrintList(List head)//输出链表的数据
{
List p = head->next;
while (p) {
printf("\t%d", p->data);
p = p->next;
}
putchar('\n');
}
void Merge(List &La, List &Lb, List &Lc) {
List pa = La->next;
List pb = Lb->next;
List pc = La;
Lc = La;
while (pa && pb)//两者都不为空指针时
{
if (pa->data <= pb->data)//把pa所指的结点插入到链表Lc中,采用尾插法
{
pc->next = pa;
pc = pa;//pc始终指向链表Lc的尾结点
pa = pa->next;
} else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
//如果走出循环了,有可能是一个链表遍历完了,另一个还没有遍历完.
pc->next = pa ? pa : pb;//把剩余没有遍历完的数据段插入到Lc后面
free(Lb);
}
int main() {
int n;
printf("请输入链表A的数据规模:\n");
scanf("%d", &n);
List La = NULL, Lb = NULL, Lc = NULL;
CreateList_n(La, n);
printf("所建的链表A为:\n");
PrintList(La);
printf("请输入链表B的数据规模:\n");
scanf("%d", &n);
CreateList_n(Lb, n);
printf("所建的链表A为:\n");
PrintList(Lb);
Merge(La, Lb, Lc);
printf("归并后的链表为:\n");
PrintList(Lc);
return 0;
}
一般来说不需要,你只要在使用之前初始化就可以了
这里说的初始化可不一定就是初始化成 NULL 一般是初始化成一个对象的指针,就是已经可以使用的地址
一个变量的地址或者 malloc 返回的地址
char *str;
// ....
// ....
// ....
str = get_string();
这样定义的时候不初始化成 NULL,在某个位置直接赋值成一个已经可以使用的地址
|