【C语言程序设计第四版】例11-10代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct stud_node{
    int num;
    char name[20];
    int score;
    struct stud_node *next;
};

struct stud_node *Create_Stu_Doc(void);
struct stud_node *InsertDoc(struct stud_node *head, struct stud_node *stud);
struct stud_node *DeleteDoc(struct stud_node *head, int num);
void Print_Stu_Doc(struct stud_node *head);

int main(void){
    struct stud_node *head=NULL, *p=NULL;
    int choice, num, score;
    char name[20];
    int size = sizeof(struct stud_node);
    
    do{
        printf("1: Create 2: Insert 3: Delete 4: Print 0: Exit\n");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                head = Create_Stu_Doc();
                break;
            case 2:
                printf("Input num, name and score:\n");
                scanf("%d%s%d", &num, name, &score);
                p = (struct stud_node *)malloc(size);
                p -> num = num;
                strcpy(p->name, name);
                p -> score = score;
                head = InsertDoc(head, p);
                break;
            case 3:
                printf("Input num: \n");
                scanf("%d", &num);
                head = DeleteDoc(head, num);
                break;
            case 4:
                Print_Stu_Doc(head);
                break;
            case 0:
                break;
        }
    }while (choice !=0 );
        
    return 0;
}

// 初始化数据
struct stud_node *Create_Stu_Doc(){
    struct stud_node *head, *p;
    int num, score;
    char name[20];
    int size = sizeof(struct stud_node);
    
    head = NULL;
    printf("Input num, name and score:\n");
    scanf("%d%s%d", &num, name, &score);
    while (num != 0) {
        p = (struct stud_node *)malloc(size);
        p -> num = num;
        strcpy(p -> name, name);
        p -> score = score;
        head = InsertDoc(head, p);   // 是否是第一个元素由该函数去判断
        scanf("%d%s%d", &num, name, &score);
    }
    
    return head;
}

/* 插入操作 */
struct stud_node *InsertDoc(struct stud_node *head, struct stud_node *stud){
    struct stud_node *ptr, *ptr1, *ptr2;
    ptr2 = head;
    ptr = stud;
    ptr1 = NULL;
    
    if (head == NULL) {
        head = ptr;
        head->next = NULL;
    }else{
        while ((ptr -> num > ptr2 -> num) && ptr2 -> next != NULL) {
            ptr1 = ptr2;
            ptr2 = ptr2 -> next;
        }
        if (ptr -> num <= ptr2 -> num) {
            if (head == ptr2) {
                head = ptr;     // 插入的数据为第一个元素
            }else{
                ptr1 -> next = ptr;
            }
            ptr -> next = ptr2;
            
        }else{
            ptr2->next = ptr;
            ptr->next = NULL;
        }
    }
    
    return head;
}

struct stud_node *DeleteDoc(struct stud_node *head, int num){
    
    struct stud_node *ptr1, *ptr2;
    
    ptr1 = ptr2 = NULL;
    
    // 头部的就为符合条件的情况下,删除符合条件的节点
    while (head !=NULL && head->num ==num) {
        ptr2 = head;
        head = head->next;
        free(ptr2);
    }
    
    if (head == NULL) {
        return NULL;
    }
    ptr1 = head;
    ptr2 = head->next;
    while (ptr2 != NULL) {    // 这个删除的设计也非常巧妙
        if (ptr2->num == num) {
            ptr1->next = ptr2->next;
            free(ptr2);
        }else{
            ptr1 = ptr2;
        }
        ptr2 = ptr1->next;
        
    }
    
    return head;
}

void Print_Stu_Doc(struct stud_node *head){
    struct stud_node *ptr;
    if (head == NULL) {
        printf("\nNo Records\n");
        return;
    }
    printf("\nThe Students'Records Are: \n");
    printf("Num\t Name\t Score\n");
    for (ptr=head; ptr!=NULL; ptr=ptr->next) {
        printf("%d\t%s\t%d\n", ptr->num, ptr->name, ptr->score);
    }
    
}

 

posted @ 2021-09-25 21:14  就是想学习  阅读(112)  评论(0编辑  收藏  举报