2024.8.12

作业:创建单链表,存储4个学生信息(年龄,分数,姓名)。
1、建立学生结构体数组,存放4个学生信息,循环调用插入函数,建立整表2、任意位置插入一个新学生。变量e是学生结构体变量。
3、任意位置删除一个学生。
4、单链表逆置后将学生信息输出。
 

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

typedef struct node{
	union{
		int len;
		struct{
			char name[10];
			int age;
			int score;
		}data;
	};
	struct node *next;
}s,*sp;
sp getHead();
int insertStudent(sp p);
int randomInsert(sp p);
int randomDelete(sp p);
int reverse(sp p);
void outLink(sp p);

int main(int argc, const char *argv[])
{
	sp head=getHead();
	for(int i=0;i<4;i++){
		insertStudent(head);
	}
	outLink(head);
	randomInsert(head);
	outLink(head);
	randomDelete(head);
	outLink(head);
	reverse(head);
	outLink(head);
	return 0;
}
//获取头结点
sp getHead(){
	sp p=malloc(sizeof(s));
	if(p==NULL){
		printf("申请空间失败");
		return NULL;
	}
	p->len=0;
	p->next=NULL;
	return p;
}
//顺序添加
int insertStudent(sp p){
	sp node=malloc(sizeof(s));
	if(node==NULL){
		printf("申请空间失败");
		return -1;
	}
	char name[10];
	int age,score;
	printf("请输入名字\n");
	scanf(" %s",name);
	printf("请输入分数\n");
	scanf(" %d",&score);
	printf("请输入年龄\n");
	scanf(" %d",&age);
	p->len++;
	node->next=NULL;
	while(p->next!=NULL){
		p=p->next;
	}
	p->next=node;
	strcpy(node->data.name,name);
	node->data.score=score;
	node->data.age=age;
	return 0;
}
void outLink(sp p){
	p=p->next;
	while(p!=NULL){
		printf("学生:%s\t年龄%d\t成绩%d\n",p->data.name,p->data.age,p->data.score);
		p=p->next;
	}
}
//随机插入
int randomInsert(sp p){
	int seq;
	printf("请输入插入位置");
	scanf(" %d",&seq);
	if(seq<1||seq>p->len){
		printf("插入位置非法");
		return -2;
	}
	sp node=malloc(sizeof(s));
	if(node==NULL){
		printf("申请空间失败");
		return -1;
	}
	char name[10];
	int age,score;
	printf("请输入名字\n");
	scanf(" %s",name);
	printf("请输入分数\n");
	scanf(" %d",&score);
	printf("请输入年龄\n");
	scanf(" %d",&age);
	p->len++;
	for(int i=1;i<seq;i++){
		p=p->next;
	}
	node->next=p->next;
	p->next=node;
	strcpy(node->data.name,name);
	node->data.score=score;
	node->data.age=age;
	return 0;
}
//随机删除
int randomDelete(sp p){
	int seq;
	printf("请输入删除位置");
	scanf(" %d",&seq);
	if(seq<1||seq>p->len){
		printf("删除位置非法");
		return -2;
	}
	for(int i=1;i<seq;i++){
		p=p->next;
	}
	sp node=p->next;
	p->next=p->next->next;
	free(node);
	return 0;
}
//逆置
int reverse(sp p){
	sp next=NULL;
	sp current=p->next;
	sp pre=NULL;
	while(current!=NULL){
		//这个不难,我一开始想要同时修改一个节点的前后节点。
		//步子迈太大,需要更多的变量和更复杂的逻辑。
		//注意从一个方向开始处理,而不同从一个节点。
		//保存下一个节点,以免丢失
		pre=current->next;
		//指向上一个节点
		current->next=next;
		//将上一个节点赋值为本节点
		next=current;
		//讲本节点移动至下一个节点
		current=pre;
	}
	//注意,最后current会变成NULL,而next才是第一个元素。
	p->next=next;
return 0;
}
	

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值