博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单链表的基本操作(第二篇)
阅读量:4609 次
发布时间:2019-06-09

本文共 2152 字,大约阅读时间需要 7 分钟。

与第一篇不同的点是单链表的建立方法,以及合并两个有序链表。

知识点介绍:

1.何为野指针?

野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。与空指针不同,野指针无法通过简单地判断是否为NULL避免,而只能通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。

2.野指针的成因主要有两种:

(1)、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
(2)、指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。(引用别人博客上的解释)

如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它 指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内存,如果是那样就糟 了,也许我们后面不小心对指针进行操作就有可能让系统出现紊乱,死机了。

下面程序在开始写的时候就出现过这种情况,所以上面介绍了一下野指针,具体地方程序中注释出来了。

单链表结点的定义和初始化以及打印函数与第一篇相同,这里不再列出。

顺序输入n个元素的值,建立带表头结点的单链表:

//建立单链表void CreatlistR(LinkLNode *head, int n){	LinkLNode *node;	head->next = NULL;	for (int i = 0; i < n; i++)	{		node = (LinkLNode*)malloc(sizeof(LinkLNode));		scanf("%d", &node->data);		head->next = node;		head = node;	}	head->next = NULL;//开始没加这句,导致exe停止工作  ?想想为什么?	                               //因为没加这句时,通过调试发现head->next指向别处地址。指的地方是随机的,如果指的地址有权限限制就会出现异常崩溃。	                              //野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。}

  

合并两个有序链表:

//合并两个有序链表void merge(LinkLNode *head1, LinkLNode *head2) {	LinkLNode *pa, *pb, *pc;	pa = head1->next;	pb = head2->next;	pc = head1;	while (pa != NULL&&pb != NULL)	{		if (pa->data <= pb->data)		{			pc->next = pa; //pc->next已经为pa了。			pc = pa;			pa = pa->next;		}		else		{			pc->next = pb;			pc = pb;			pb = pb->next;		}	}	//pc->next = pa ? pa : pb;   //更简便的写法 	//注意:开始写成pa=NULL,结果数据输出不完整	//第二次改为pa->next=NULL以为对的,输入样例:1 2 3 4 5 和6 7 8 9 10 11发现又错了,注意=与==!!!	if (pa==NULL) 		pc->next = pb;	else		pc->next = pa;}

 

主函数:

LinkLNode List_head1;LinkLNode List_head2;int main(){	Init_List(&List_head1);	Init_List(&List_head2);		CreatlistR(&List_head1, 5);	printf("打印链表1里的数:");	print_List(&List_head1);	printf("\n");	CreatlistR(&List_head2, 6);	printf("打印链表2里的数:");	print_List(&List_head2);	printf("\n");	printf("有序链表1和2合并为有序链表:");	merge(&List_head1, &List_head2);	print_List(&List_head1);	printf("\n");}

  

运行结果:

  

转载于:https://www.cnblogs.com/lululove/p/7243475.html

你可能感兴趣的文章
hdu - 2266 How Many Equations Can You Find (简单dfs)
查看>>
UIView属性
查看>>
将博客搬至CSDN
查看>>
远程服务器git搭建
查看>>
牛人们的博客地址
查看>>
Zabbix是什么?
查看>>
源码:COCO微博
查看>>
面向对象预习随笔
查看>>
大数据概念炒作周期模型
查看>>
排序模型
查看>>
Dede推荐文章与热点文章不显示?
查看>>
React 3
查看>>
Topshelf 使用
查看>>
Linux --Apache服务搭建
查看>>
20145325张梓靖 实验三 "敏捷开发与XP实践"
查看>>
JavaScript面试题
查看>>
[转帖]架构师眼中的高并发架构
查看>>
ios的一些开源资源
查看>>
HTTP 错误 500.21 - Internal Server Error 解决方案
查看>>
Bucks sign Sanders to $44 million extension
查看>>