定义结构体变量,创建链表,对链表进行简单的基本操作,完成以下任务要求。
题目描述:
1、有n个学生,每个学生的数据包括学号、姓名、性别、年龄、班级等信息,从键盘输入n个学生的数据并以链表方式存储(单向、双向不限)。
2、根据输入要求,在原有学生数据中任意位置插入一个新学生数据。
3、根据输入要求,在原有学生数据中删除任意学号的学生数据。
4、能输出所有学生信息。
算法描述:首先定义一个结构体,里面包含一个指向下一个结构的结构指针(Student *next),接着在主函数里面定义多个结构指针:
Student *first=NULL; //仅用于存储第一个结构的地址
Student *current=NULL; //存储正在处理的结构的地址
Student *previous=NULL;//跟踪前一个处理过的结构地址
Student *new=NULL; //插入新的结构的地址
Student *tem=NULL; //删除一个结构时所需要的一个临时结构的地址
接着给current分配内存,然后用for循环输入学生信息直到current->next=NULL。然后考虑插入信息的情况:先输入要插入的信息,然后插入位置分为第一个、中间以及最后一个位置。插入第一个时new->next=first;first=new;插入中间以及最后时用for循环从头开始找到要的插入位置。插入中间时把指针current指向first,找到位置后previous->next=new;
new->next=current;插入最后时current->next=new;new->next=NULL。
然后到了删除部分,分为删除第一个以及不是第一个。
if(first->number==del_num)//如果删除第一个
{
tem=first;
first=first->next;
free(tem);
}
else //如果删除不是第一个
{
current=first;
while(current->number!=del_num)
{
previous=current;
previous=current;}
previous->next=current->next;
free(current);
}
最后就是输出结果了。然后要令previous=current保存指针以便释放内存。
//定义结构体变量,创建链表,对链表进行简单的基本操作,完成以下任务要求
#define __STDC_WANT_LIB_EXT1__ 1
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
typedef struct Student Student;
struct Student
{
int number; //学号
char name[20]; //名字
char sex[5]; //性别
int old; //年龄
int class; //班级
Student *next; //指向下一个结构
};
int main(void)
{
Student *first=NULL; //仅用于存储第一个结构的地址
Student *current=NULL; //存储正在处理的结构的地址
Student *previous=NULL;//跟踪前一个处理过的结构地址
Student *new=NULL; //插入新的结构的地址
Student *tem=NULL; //删除一个结构时所需要的一个临时结构的地址
char test1,test2,test3;//结束输入的测试值
int total=0; //链表节点数
//输入学生的学号、姓名、性别、年龄和班级信息
for(;;)
{
printf("Enter a%s student(YorN)?",first!=NULL?"nother":" ");
fflush(stdin);
scanf_s("%c",&test1,sizeof(test1));
if(tolower(test1)=='n')
break;
current=(Student*)malloc(sizeof(Student));//给每一个Student结构分配内存
if(first==NULL) //若first=NULL,表示开始输入第一个文件
first=current;
if(previous!=NULL) //第一次迭代中previous为NULL,第二次及后续的迭代中应将当前结构地址存储到前一个结构的next
previous->next=current; //成员中,前一个结构的地址存储到previous指针中
printf("Please enter student's number,name,sex,old,class in order:");
scanf("%d",¤t->number);
scanf("%s",current->name);
scanf("%s",current->sex);
scanf("%d",¤t->old);
scanf("%d",¤t->class);
current->next=NULL; //表示这是最后一个结构了
previous=current;
++total; //统计链表节点数
}
printf("\n");
//插入学生的学号、姓名、性别、年龄和班级信息
for(;;)
{
printf("Do you want to add one(YorN)?");
scanf_s(" %c",&test2,sizeof(test2));
if(tolower(test2)=='n')
break;
printf("Enter the postion:");
int position; //插入的位置
scanf("%d",&position);
new=(Student*)malloc(sizeof(Student));
printf("Please enter student's number,name,sex,oid,class in order:");
scanf("%d",&new->number);
scanf("%s",new->name);
scanf("%s",new->sex);
scanf("%d",&new->old);
scanf("%d",&new->class);
current=first;
//假如插入第一个位置
if(position==1)
{
new->next=first;
first=new;
}
//假如插入最后一个位置
else if(position-1==total)
{
for(int i=1;i<position; ++i)
{
current=current->next;
}
current->next=new;
new->next=NULL;
}
//假如插入中间
else
{
current=first;
for(int i=1;i<position;++i)
{
previous=current;
current=current->next;
}
previous->next=new;
new->next=current;
}
}
//删除学生的学号、姓名、性别、年龄和班级信息
for(;;)
{
printf("Do you want to delete one(YorN)?");
fflush(stdin);
scanf_s(" %c",&test3,sizeof(test3));
if(tolower(test3)=='n')
break;
printf("Enter the studet number of data: ");
int del_num;
scanf("%d",&del_num);
if(first->number==del_num)//如果删除第一个
{
tem=first;
first=first->next;
free(tem);
}
else //如果删除不是第一个
{
current=first;
while(current->number!=del_num)
{
previous=current;
previous=current;
}
previous->next=current->next;
free(current);
}
}
//输出学生的学号、姓名、性别、年龄和班级信息
current=first; //从first开始执行循环输出信息
while(current!=NULL)
{
printf("student number:%d student name:%s student sex:%s student old:%d student class:%d ",current->number,current->name,current->sex,current->old,current->class);
printf("\n");
previous=current; //保存指针以便释放内存
current=current->next;
free(previous);
previous=NULL;
}
first=NULL;
return 0;
}