#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);
}
}