定义结构体变量,创建链表,对链表进行简单的基本操作

定义结构体变量,创建链表,对链表进行简单的基本操作,完成以下任务要求。
题目描述:
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",&current->number);
		scanf("%s",current->name);
		scanf("%s",current->sex);
		scanf("%d",&current->old);
		scanf("%d",&current->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;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值