习题 9.9 综合本章例9.9、例9.10和本章习题第7题、第8题,再编写一个主函数,先后调用这些函数。用以上5个函数组成一个程序,实现链表的建立、输出、删除和插入,在主函数中指定需要删除和插入结点。

C程序设计(第四版) 谭浩强 习题9.9 个人设计

习题 9.9 综合本章例9.9、例9.10和本章习题第7题、第8题,再编写一个主函数,先后调用这些函数。用以上5个函数组成一个程序,实现链表的建立、输出、删除和插入,在主函数中指定需要删除和插入结点的数据。

代码块:

说明:由于insert函数中有一个关于在头指针前插入结点的问题一直没有解决,在论坛中求助坛友@sghcpt解决了关于头结点前插入结点后重复输出的问题。代码中关于插入问题是由@sghcpt修改贡献的代码,特此感谢!

#include 
#include 
struct Student{                       //定义结构体(双向链表结构体)
	int num;
	float score;
	Student *prev;
	Student *next;
};
Student *input();                     //定义输入函数
void print(Student *stu);             //定义输出函数
void del(Student *stu, float n);      //定义删除函数
void insert(Student **stu, int m, char direc, Student *ins);   //定义插入函数
int main()
{
	Student *stud, in, *inser;        //定义结构体指针,插入的结构体变脸,指向插入结构体变量的指针
	float del_score;                  //定义删除函数的参数(需要删除的对应分数)
	int insert_num;                   //定义要插入的结点学号
	char dir;                         //定义前插后插的方向变量
	stud=input();                     //调用输入函数
	print(stud);                      //输出全部数据
	printf("Please enter delete score: ");       //输入要删除的分数
	scanf("%f", &del_score);
	getchar();                        //此项是清除缓冲区内scanf函数输入的最后一个换行符'\n',此后出现该语句作用相同
	del(stud, del_score);             //调用删除函数
	print(stud);                      //输出结果
	printf("Please enter insert student info: ");      //输入要插入的学生数据(学号和成绩)
	scanf("%d %f", &in.num, &in.score);
	getchar();
	inser=∈                        //结构体变量指针指向in
	printf("Please enter insert num: ");               //输入要插入哪个学号
	scanf("%d", &insert_num);
	getchar();
	printf("Please enter F or B: ");                   //输入是要插入学号前还是后,F是前插,B是后插。
	scanf("%c", &dir);
	getchar();
	insert(&stud, insert_num, dir, inser);             //调用插入函数
	print(stud);
	system("pause");
	return 0;
}
//输入函数
Student *input()
{
	Student *p1, *p2, *head;
	int n=0;
	p1=p2=(Student*)malloc(sizeof(Student));
	printf("Please enter No.%d student info: ", n+1);
	scanf("%d %f", &p1->num, &p1->score);
	getchar();
	head=NULL;
	while (p1->num!=0){
		n++;
		if (n==1){
			head=p1;
			p1->prev=NULL;
		}
		else{
			p2->next=p1;
			p1->prev=p2;
		}
		p2=p1;
		p1=(Student*)malloc(sizeof(Student));
		printf("Please enter No.%d student info: ", n+1);
		scanf("%d %f", &p1->num, &p1->score);
		getchar();
	}
	p2->next=NULL;
	return head;
}
//输出函数
void print(Student *stu)
{
	Student *p;
	printf("Output Result:\n");
	for (p=stu; p!=NULL; p=p->next)
		printf("%d %.2f\n", p->num, p->score);
}
//删除函数
void del(Student *stu, float n)
{
	Student *p, *head;
	for (p=stu, head=p; p!=NULL; p=p->next)
		if (p->score==n){
			if (p==head){
				head=p->next;
				p->next->prev=NULL;
				head->next=p->next->next;
			}
			else if (p->next==NULL)
				p->prev->next=NULL;
			else{
				p->prev->next=p->next;
				p->next->prev=p->prev;
			}
		}
	*stu=*head;
}
//插入函数
void insert(Student **stu, int m, char direc, Student *ins)
{
	Student *p, *head;
	for (p=*stu, head=p; p!=NULL; p=p->next){
		if (p->num==m){
			if (direc=='F'){
				if (p==head){
					ins->next=p;
					ins->prev=NULL;
					head=ins;
				}
				else{
					ins->prev=p->prev;
					p->prev->next=ins;
					ins->next=p;
					p->prev=ins;
				}
			}
			else if (direc=='B'){
				if (p->next==NULL){
					p->next=ins;
					ins->next=NULL;
					ins->prev=p;
				}
				else{
					ins->next=p->next;
					p->next=ins;
					ins->prev=p;
				}
			}
		}
	}
	*stu=head;
}

你可能感兴趣的:(C程序设计,(第四版),谭浩强,课后答案)