习题 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 <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;                        //结构体变量指针指向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;
}

猜你喜欢

转载自blog.csdn.net/navicheung/article/details/81166609