- 46
- 0
- 约2.42千字
- 约 5页
- 2017-03-05 发布于重庆
- 举报
C_lab10-1_链表初步
实验10-1 链表初步
【知识点回顾】
一
【典型例题】
例题1,
例题2,
//exp2
例题3,
//exp3
【QA】
Q:宏NULL表示什么?
A:NULL实际是表示0.当指针为0时,会要求编译器把它看成是空指针而不是整数0.提供宏NULL只是为了避免混乱。赋值表达式p=NULL;用于明确地说明p是空指针。
Q:既然0用于表示空指针,那么空指针就是字节中各位都为0的地址,对吗??
A:不一定。每个C语言编译器都被允许用不同的方式来表示空指针,而且不是所有编译器都使用零地址的。一些编译器为空指针使用不存在的内存地址。硬件会检查出这种试图通过空指针访问内存的方式。我们不必关心如何在计算机内存储空指针。这是编译器专家关注的细节。重要的是,当在指针环境中使用0时,编译器会把它转换为适当的内部形式。
Q:强制类型转换malloc或者其他内存分配函数的返回值,有无必要?
A:强制类型转换这些函数返回的值类型,是经典C延留下来的习惯,源于经典C中,内存分配函数返回char*类型的值,用强制类型转换实现是必要的。而标准C却不是必需的,因为void *型指针会在复制操作时自动转换为任何指针类型。
【实验内容】
请编写一个函数void wndProc(char*msg),要求在给定字符串作为实际参数时,此函数搜索下列所示的结构数组,寻找匹配的命令名,然后调用和匹配名称相关的函数。
struct
{
char *cmd_name;
void (*cmd_pointer)(void);
}file_cmd[]=
{ {new, new_cmd},
{open, open_cmd},
{close, close_cmd},
{close all, close_all_cmd},
{save, save_cmd},
{save as, save_as_cmd},
{save all, save_all_cmd},
{print, print_cmd},
{exit, exit_cmd},
};
设计程序,动态创建(堆式创建)不带有头结点的包含10个结点的单链表,该链表结点由整型数据域和指针域构成,键盘输入整型数据,依次为1,2,3,4,5,6,7,8,9,10:
采用头插法创建单链表:
采用尾插法创建单链表:
已知head指向一个不带有头结点的单链表,链表中每个结点包含数据域和指针域,以下程序片断求出链表所有结点中,数据域最大的结点的位置,由指针变量s传回主调函数,请完成程序设计。
针对Lab9-2中实验内容1,某航空公司的座位预定程序设计,要求改动如下:
创建一个不带头结点的单链表,每个结点要包括一个用于标识座位的编号、一个标识座位是否已分配出去的标记、座位预订人的姓、座位预订人的名、以及指向下个结点的指针域。
尝试输出链表中的结点信息
【课后练习】
选择题:
有以下结构体类型定义及变量声明,且如下图所示,指针p指向变量a,指针q指向变量b,则不能把结点b连接到结点a之后的语句是 。
struct
{
char data;
struct node * next;
}a, b, *p = a, *q = b; A.a.next = q; B.p.next = b;
C.p-next = b; D.(*p).next = q;
若以建立下图中的链表结构,指针p、q分别指向图中所示结点,则不能将q所指的结点插入到链表末尾的一组语句是: 。
A. q-next = NULL; p = p-next; p-next = q;
B. p = p-next; q-next = p-next; p-next = q;
C. p = p-next; q-next = p; p-next = q;
D. p = (*p).next; (*q).next = (*p).next; (*p).next = q;
填空题:
链表有一个“头指针”变量,专门用来存放 。
常常用结构体变量作为链表中的结点,单链表中,每个结点都包括两部分:一个是 ,用来存放 ,一个是 , 用来存放 。
单链表中,最后一个节点的指针域常常设置为 ,表示链表到此结束。
为建立如图所示的结点存储结构,请将定义补充完整
struct node
{
char data;//数据域
;//指针域
}
原创力文档

文档评论(0)