|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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,在某个位置直接赋值成一个已经可以使用的地址
|
|