建立一个链表,每个结点包括学号、姓名、性别和出生日期,保存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;
}
##数据结构##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;
} //每次调用插入或删除函数后使用打印函数将修改后的信息表输出。
复制请带链接
第一次发代码写的不好请多指教 谢谢
首先,需要定义一个结构体来存储学生信息:
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;
}