课程:C语言程序设计 学号: 姓名: 班级:
实验10-3 单链表操作
【知识点回顾】
1. 一般C程序创建步骤
1) 编辑源文件
2) 编译源文件,产生目标文件 3) 链接库文件,产生可执行文件 4) 运行可执行文件
5)
【典型例题】
1. 例题1, 2. 例题2,
3. 例题3,
【Q&A】
1. Q:?
A:。 2. Q:? A:
【实验内容】
1. 已知带有头结点的单链表,链表中每个结点包含字符型数据域data和指针域next,请
编写函数实现链表的逆置。 思路:
令p指向第一个结点,此时,从p的角度看,形成一个不带有头结点的链表。
令头结点指针域置空,即断开头结点与第一个结点的链接关系,形成头指针与头结点构成的空链
逐结点扫描p链表,每次摘取第一个结点,采用头插法插入2)构成的新链中。
2. 已知head指向一个带头结点的单向链表,链表中每个结点包含字符型数据域data和指
针域next。请编写函数实现在值为a的结点前插入值为key的结点,若值为a的结点不存在,则插在链表最后。
1
课程:C语言程序设计 学号: 姓名: 班级:
typedef char datatype; typedef struct node {
datatype data; struct node * next; } linklist;
【课后练习】
3. 已知head指向一个带有头结点的单向链表,链表中每个结点包含一个整型数据域data和指针域next,以下过程求出链表中所有链结点数据域的和值,请填空完成程序设计。
4. 以下程序的功能是读入一行字符(如a, …. y, z),按输入时的逆序建立一个不带有头结
点的单向链表,即采用 法创建链表,然后再逐结点输出,并释放全部结点,请填空完成程序设计。
#include
struct node {
char info;
struct node * link;
}*top, *p; char c; top=NULL;
while( (c=getchar() ) ) {
p= ;
p->info = ;
2
课程:C语言程序设计 学号: 姓名: 班级:
}
p->link = ; top = ;
while(top) { } }
; top= top->link;
putchar( ); free(p);
5. 已知head指向不带头结点的单向链表的第一个结点,以下函数完成的功能是:向降序单向链表中插入一个结点,使得插入后链表仍保持降序,请填空完成程序设计
#include
struct node * link; };
struct node * insert (struct node * head, struct node * stud) {
struct node * p0, *p1, *p2; p1= head; p0 = stud; if(head == NULL) { } else { }
if(p0->infor >= p1->info) {
if(head ==p1 ) {
while((p0->info < p1->info) && (p1->link!=NULL)) { }
p2= p1; p1= p1->link; head = p0; p0->link = NULL;
3
课程:C语言程序设计 学号: 姓名: 班级:
} else { }
return (head); }
p1->link = 0;
; } else { }
; p2->link = p0;
; head = p0;;
6. 已知head指向单链表的第一个结点,以下函数del完成从单向链表中删除值为num的
第一个结点,请观察以下程序片段,该链表是否带有头结点? 。填空完成程序设计,
#include
struct node * link; };
struct node * del(struct node * head, int num) {
struct node *p1, *p2;
if(head == NULL) { } else {
p1= head;
while( ) { }
if(num != p1->info) {
p2= p1; p1= p1->link; priintf(\
4
课程:C语言程序设计 学号: 姓名: 班级:
}
if(p1==head)
else free(p1);
printf(\
else
printf(\
}
return (head); }
5