建立一个链表,每个结点包括学号、姓名、性别和出生日期,保存5名学生信息,链表按学号从小到大排序。键盘接收一名新生信息,插入在恰当位置。

建立一个链表,每个结点包括学号、姓名、性别和出生日期,保存5名学生信息,链表按学号从小到大排序。键盘接收一名新生信息,插入在恰当位置。

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

// 定义链表节点结构体
struct student {
    int id;  // 学号
    char name[20];  // 姓名
    char sex[5];  // 性别
    char birthdate[20];  // 出生日期
    struct student* next;  // 指向下一个节点的指针
};

// 插入新节点到链表的合适位置
void insert(struct student** head, struct student* new_student) {
    struct student* current;

    // 如果链表为空,直接将新节点插入到头节点
    if (*head == NULL || (*head)->id >= new_student->id) {
        new_student->next = *head;
        *head = new_student;
    } else {
        // 在链表中寻找新节点应该插入的位置
        current = *head;
        while (current->next != NULL && current->next->id < new_student->id) {
            current = current->next;
        }

        // 插入新节点
        new_student->next = current->next;
        current->next = new_student;
    }
}

int main() {
    // 初始化链表头节点为空
    struct student* head = NULL;

    // 初始化5个学生的信息,按照学号从小到大排序插入到链表中
    struct student* student1 = (struct student*) malloc(sizeof(struct student));
    student1->id = 1;
    strcpy(student1->name, "Tom");
    strcpy(student1->sex, "M");
    strcpy(student1->birthdate, "1999-01-01");
    insert(&head, student1);

    struct student* student2 = (struct student*) malloc(sizeof(struct student));
    student2->id = 3;
    strcpy(student2->name, "Lucy");
    strcpy(student2->sex, "F");
    strcpy(student2->birthdate, "1998-02-01");
    insert(&head, student2);

    struct student* student3 = (struct student*) malloc(sizeof(struct student));
    student3->id = 4;
    strcpy(student3->name, "David");
    strcpy(student3->sex, "M");
    strcpy(student3->birthdate, "2000-05-01");
    insert(&head, student3);

    struct student* student4 = (struct student*) malloc(sizeof(struct student));
    student4->id = 7;
    strcpy(student4->name, "Lily");
    strcpy(student4->sex, "F");
    strcpy(student4->birthdate, "2001-01-01");
    insert(&head, student4);

    struct student* student5 = (struct student*) malloc(sizeof(struct student));
    student5->id = 8;
    strcpy(student5->name, "Bob");
    strcpy(student5->sex, "M");
    strcpy(student5->birthdate, "1997-03-01");
    insert(&head, student5);

    // 输出链表中所有学生的信息
    struct student* current = head;
    printf("学号\t姓名\t性别\t出生日期\n");
    while (current != NULL) {
        printf("%d\t%s\t%s\t%s\n", current->id, current->name, current->sex, current->birthdate);
        current = current->next;
    }

    // 从键盘输入新学生的信息
    struct student* new_student = (struct student*) malloc(sizeof(struct student));
    printf("请输入新生信息:\n");
    printf("学号:");
    scanf("%d", &(new_student->id));
    printf("姓名:");
    scanf("%s", new_student->name);
    printf("性别:");
    scanf("%s", new_student->sex);
    printf("出生日期:");
    scanf("%s", new_student->birthdate);

    // 插入新学生的信息到链表中
    insert(&head, new_student);

    // 输出新链表中所有学生的信息
    current = head;
    printf("学号\t姓名\t性别\t出生日期\n");
    while (current != NULL) {
        printf("%d\t%s\t%s\t%s\n", current->id, current->name, current->sex, current->birthdate);
        current = current->next;
    }

    return 0;
}

看题目意思,学号不是随录入而增加,而是可能先录入大学号,后录入小学号,涉及根据学号排序,将学生信息插入链表中适当位置。需要用到链表排序知识,参考如下:

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

struct student {
    int id;
    char name[20];
    char sex[2];
    char birth[10];
    struct student *next;
};

struct student *create(int n) {
    struct student *head = NULL;
    struct student *p1 = NULL;
    struct student *p2 = NULL;
    int i;

    for (i = 0; i < n; i++) {
        p1 = (struct student *)malloc(sizeof(struct student));
        printf("请输入第%d个学生的信息:\n", i + 1);
        printf("学号:");
        scanf("%d", &p1->id);
        printf("姓名:");
        scanf("%s", p1->name);
        printf("性别:");
        scanf("%s", p1->sex);
        printf("出生日期:");
        scanf("%s", p1->birth);
        p1->next = NULL;

        if (head == NULL) {
            head = p1;
            p2 = p1;
        } else {
            p2->next = p1;
            p2 = p1;
        }
    }

    return head;
}

struct student *insert(struct student *head) {
    struct student *p0, *p1, *p2;

    p0 = (struct student *)malloc(sizeof(struct student));
    printf("请输入新学生的信息:\n");
    printf("学号:");
    scanf("%d", &p0->id);
    printf("姓名:");
    scanf("%s", p0->name);
    printf("性别:");
    scanf("%s", p0->sex);
    printf("出生日期:");
    scanf("%s", p0->birth);
    p0->next = NULL;

    if (head == NULL) {
        head = p0;
        return head;
    }

    if (p0->id < head->id) {
        p0->next = head;
        head = p0;
        return head;
    }

    for (p1 = head, p2 = head; p1 != NULL; p2 = p1, p1 = p1->next) {
        if (p0->id < p1->id) {
            break;
        }
    }

    if (p1 == NULL) {
        p2->next = p0;
        return head;
    }

    if (p1 == head) {
        p0->next = head;
        head = p0;
        return head;
    }

    p2->next = p0;
    p0->next = p1;

    return head;
}

void print(struct student *head) {
    struct student *p;

    printf("\n学号\t姓名\t性别\t出生日期\n");

    for (p = head; p != NULL; p = p->next) {
        printf("%d\t%s\t%s\t%s\n", p->id, p->name, p->sex, p->birth);
    }
}

int main() {
    struct student *head;
    
    head=create(5); // 创建链表
    print(head); // 输出链表
    head=insert(head); // 插入新节点
    print(head); // 输出链表

    return 0;
}

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7591210
  • 这篇博客也不错, 你可以看下C语言:某班有N名同学,每个学生的信息包括学号、姓名、三门课的成绩,从键盘输入名学生的信息,打印出N名学生三门课的平均成绩,以及最高分学生的信息(包括学号,姓名,三门课的成绩,平均分)
  • 除此之外, 这篇博客: 创建一个顺序表实现学生信息管理中的 创建一个顺序表实现学生信息管理,查找,插入,删除以及打印 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • ##数据结构##C语言##顺序表

    //1声明及数据类型定义
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #define MAXSIZE 200  //线性表存储空间初始分配量 
    typedef struct stduent {  //定义“学生“数据类型 
    	int num;
    	char name[10];
    	char sex;
    	int age;
    	char major[12];
    } ElemType; 
    typedef struct {
    	ElemType  *data;
    	int length;
    	int listsize;
    } Stulist;
    FILE *fp;//将文件指针定义为全局变量便于后续修改保存数据
    
    //2初始化及文件数据导入
    
    
    void IniList_Seq(Stulist &L) {    //初始化 
    	L.data=(ElemType*) malloc (sizeof(ElemType)*MAXSIZE);
    	if (!L.data) exit(OVERFLOW);  //存储分配失败
    	L.length=0;                  //空表长度为0  
    }
    void fileopen(Stulist &L) {  //导入文件数据 
    	fp=fopen("student information.txt","r"); //该文本文件为数据源
        if((fp=fopen("student information.txt","r"))==NULL){  //对返回值进行测试,打开失败则显示提示信息 
        printf("can not open file");
        exit(0);}	
        int i=0;
        printf("SNO SNAME Sex Age Major\n");
        while(!(feof(fp))){  //当前位置不在文件尾部 
        	fscanf(fp,"%d %s %c %d %s\n",&L.data[i].num,&L.data[i].name,&L.data[i].sex,&L.data[i].age,&L.data[i].major ); //以fscanf()输入数据 文档数据之间用空格间隔 注意\n不然运行结果会出现乱码
        	printf("%d  %s    %c  %d  %s\n",L.data[i].num,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
        	L.length=i+1;
        	i++;
    	}     
        fclose(fp);
    }
    
    //3查找
    
    int LcateElem_Seq(Stulist L){ //查找函数 
    	int e;
    	printf("输入需要查找学生学号:\n");
    	scanf("%d",&e);
    	for(int i=0;i<L.length ;i++)
    		if(L.data[i].num==e){
    			printf("该生信息为:\n");
    			printf("学号:%d 姓名:%s 性别:%c 年龄:%d 专业:%s\n",L.data[i].num,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
    		return i+1;	}
    	return 0;
    }
    //4插入和删除
    
    void ListInsert_Seq(Stulist &L) {//插入函数 
    	ElemType a;
    	int i;
    	printf("输入需要插入学生信息(依次输入学号,姓名,性别,年龄,专业并用空格间隔)\n");
    	scanf("%d %s %c %d %s",&a.num,a.name,&a.sex,&a.age,a.major);
    	printf("输入插入位置:");scanf("%d",&i);
    	if(L.length >=MAXSIZE){
    		printf("线性表已满"); exit(OVERFLOW); }
    	if(i<1||i>L.length +1){
    		printf("位置非法"); exit(OVERFLOW);}
        for(int j=L.length-1;j>=i-1;j--)
        	L.data[j+1]=L.data[j];
        L.data[i-1]=a;
        L.length++;	
    }
    void ListDelet(Stulist &L){
    	int i,p;
    	printf("输入删除位置:");scanf("%d",&i);
    	p=L.data[i-1].num;
    	printf("删除学生学号为:%d\n",p);
    	if(i<1||i>L.length +1){
    		printf("位置非法"); exit(OVERFLOW);}
    	for(int j=i;j<L.length;j++)
    	    L.data[j-1]=L.data[j];
    	L.length--;
    }
    
    //5打印函数
    void printlist(Stulist &L) {//打印函数 
    	printf("修改后学生信息为:\n");
    	printf("SNO SNAME Sex Age Major\n");
    	for(int i=0;i<L.length;i++)
    	    	printf("%d %s   %c %d %s\n",L.data[i].num,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
    }
    
    //6主函数
    int main(){
    	Stulist L;
    	IniList_Seq(L);  //初始化函数 
    	fileopen(L);     //文件打开函数,导入数据 
    	int choice;
    	printf("输入你要进行的操作(1查找 2插入 3删除 0退出)\n");
    	scanf("%d",&choice);
    	while (choice!=0){
    		switch(choice){
    		case 1 :LcateElem_Seq(L); //查找
    		break;
    		case 2:ListInsert_Seq(L);printlist(L);
    		break;//插入
    		case 3:ListDelet(L) ;//删除 
        	printlist(L); break;
    	}
    	printf("输入你要进行的操作(1查找 2插入 3删除 0退出)\n");
    	scanf("%d",&choice);
    	}
    	fp=fopen("SI.out","w");
    	for(int i=0;i<L.length;i++)
    		fprintf(fp,"%d %s   %c %d %s\n",L.data[i].num,L.data[i].name,L.data[i].sex,L.data[i].age,L.data[i].major);
    	fclose(fp);
    	system("SI.out");
    	return 0;
    	
    } //每次调用插入或删除函数后使用打印函数将修改后的信息表输出。
    

    复制请带链接
    第一次发代码写的不好请多指教 谢谢

以下内容部分参考ChatGPT模型:


首先,需要定义一个结构体来存储学生信息:

struct Student {
    int id;
    char name[20];
    char gender;
    char birthdate[10];
    struct Student *next;
};

然后,需要编写一个函数来插入新生信息。这个函数需要接收一个指向链表头的指针,以及一个新生的结构体指针。函数会将新生插入到链表中恰当的位置,保证链表仍然按照学号从小到大排序。

void insertStudent(struct Student **head, struct Student *newStudent) {
    struct Student *current = *head;
    struct Student *previous = NULL;

    // 找到新生应该插入的位置
    while (current != NULL && current->id < newStudent->id) {
        previous = current;
        current = current->next;
    }

    // 在链表头插入新生
    if (previous == NULL) {
        newStudent->next = *head;
        *head = newStudent;
    }
    // 在链表中间或尾部插入新生
    else {
        previous->next = newStudent;
        newStudent->next = current;
    }
}

最后,需要编写一个主函数来测试插入操作。先创建5个学生的结构体,并按照学号从小到大排序插入链表中。然后,从键盘读入一个新生的信息,并插入到链表中。最后,遍历链表并输出所有学生的信息。

int main() {
    struct Student *head = NULL;

    // 创建5个学生并插入链表
    struct Student *s1 = createStudent(1, "Tom", 'M', "2000-01-01");
    struct Student *s2 = createStudent(2, "Jerry", 'F', "2000-02-01");
    struct Student *s3 = createStudent(3, "Mike", 'M', "2000-03-01");
    struct Student *s4 = createStudent(4, "Lisa", 'F', "2000-04-01");
    struct Student *s5 = createStudent(5, "John", 'M', "2000-05-01");

    insertStudent(&head, s1);
    insertStudent(&head, s2);
    insertStudent(&head, s3);
    insertStudent(&head, s4);
    insertStudent(&head, s5);

    // 从键盘读入新生信息并插入链表
    struct Student *newStudent = createStudentFromInput();
    insertStudent(&head, newStudent);

    // 遍历链表并输出所有学生信息
    struct Student *current = head;
    while (current != NULL) {
        printf("ID: %d, Name: %s, Gender: %c, Birthdate: %s\n", current->id, current->name, current->gender, current->birthdate);
        current = current->next;
    }

    return 0;
}

如果我的建议对您有帮助、请点击采纳、祝您生活愉快