C程序设计(第四版) 谭浩强 习题9.9 个人设计
习题 9.9 综合本章例9.9、例9.10和本章习题第7题、第8题,再编写一个主函数,先后调用这些函数。用以上5个函数组成一个程序,实现链表的建立、输出、删除和插入,在主函数中指定需要删除和插入结点的数据。
代码块:
说明:由于insert函数中有一个关于在头指针前插入结点的问题一直没有解决,在论坛中求助坛友@sghcpt解决了关于头结点前插入结点后重复输出的问题。代码中关于插入问题是由@sghcpt修改贡献的代码,特此感谢!
#include <stdio.h>
#include <stdlib.h>
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;
}