单链表的基本操作(第二篇)
2018-06-18 04:00:48来源:未知 阅读 ()
与第一篇不同的点是单链表的建立方法,以及合并两个有序链表。
知识点介绍:
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");
}
运行结果:

标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:C语言的前世今生
下一篇:GCC编译选项 -OX[转]
- 第二章 类和对象基础 2020-04-04
- 单链表 2020-03-31
- 二叉树(1)二叉树基本操作通用接口 2020-02-06
- #《Essential C++》读书笔记# 第二章 面向过程的编程风格 2020-01-31
- 判断一个非空单链表是否是递增有序的 2019-12-15
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
