单链表的增,删,改,查以及销毁-第十五个程序20200726

	闲话不多说,直接写代码。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//创建一个存储学生姓名、性别、年龄、班级、成绩的链表,编写好链表基本功能实现的函数,调用函数对学生信息进行管理,对信息进行增删查改等操作,并建立简易的操作提示界面
struct Student //
{
	int class_;//学生的班级
	char name[20];//学生的名字
	char gender[10];//学生的性别
	int age;//学生的年龄
	int score;//学生的成绩
	Student* pnext;//指向下一个节点
};

struct Linklist//结构体用来保存链表的信息
{
	Student* head;//保存链表的起始位置
	int length;//保存链表的长度
};

//链表的初始化
Linklist* linklist_init()
{
	Linklist*temp = (Linklist*)malloc(sizeof(Linklist));//申请一个Linklist结构体空间用来保存链表的信息
	temp->head = NULL;//此时链表内没有节点,为了防止该指针变成野指针,让它指向空。
	temp->length = 0;//此时链表内没有节点,所以长度为0
	return temp;//将指针返回
}

//节点的创建
Student* Create_node(Student student)
{
	Student* temp = (Student*)malloc(sizeof(Student));//申请一个Student类型的节点空间
	//将传进来的参数存入节点内
	temp->class_ = student.class_;
	strcpy(temp->name, student.name);
	strcpy(temp->gender, student.gender);
	temp->age = student.age;
	temp->score = student.score;
	temp->pnext = NULL;//为了防止该指针变成野指针,让它指向空。
	return temp;//将指针返回
}

//从头部插入节点
void Push_head(Linklist* linklist, Student student)
{
	//如果此时链表内没有节点
	if (linklist->head==NULL)
	{
		linklist->head = Create_node(student);//将链表的头指针指向新节点
		linklist->length = 1;//链表长度为1
	}
	else
	{
		Student*temp= Create_node(student);//用临时指针保存新节点的信息
		temp->pnext = linklist->head;//将新节点的指针指向头节点
		linklist->head = temp;//将链表的头指针指向新节点
		linklist->length++;//链表长度加一
	}
}

//从尾部插入节点
void Push_end(Linklist* linklist, Student student)
{
	//如果此时链表内没有节点
	if (linklist->head == NULL)
	{
		linklist->head = Create_node(student);//将链表的头指针指向新节点
		linklist->length = 1;//链表长度为1
	}
	else
	{
		//如果链表内有节点
		Student* temp = linklist->head;//定义一个临时指针保存头节点的信息
		//找到链表的尾部
		while (temp->pnext!=NULL)
		{
			temp = temp->pnext;//当前指针偏移
		}
		temp->pnext= Create_node(student);//尾部节点指向新创建的节点
		linklist->length++;//链表长度加一
	}
}

//删除节点
void Delete_node(Linklist* linklist, char name[])
{
	//如果链表为空
	if (linklist->head==NULL)
	{
		printf("此链表没有内容可以删除!\n");
		return;//退出当前函数
	}
	else
	{
		Student* temp = linklist->head;//用临时指针保存头节点的信息
		//如果头节点满足条件
		while (linklist->head != NULL&&strcmp(linklist->head->name,name)==0)
		{
			linklist->head = linklist->head->pnext;//头指针指向头节点的下一个节点
			free(temp);//释放头节点
			linklist->length--;//链表长度减一
		}
		//如果头节点不满足要求,从第二个节点开始判断
		temp = linklist->head;//用临时指针保存头节点的信息
		while (linklist->head!=NULL&&temp!=NULL)
		{
			if (strcmp(temp->pnext->name,name)==0)
			{
				Student* node = temp->pnext;//定义一个临时指针保存当前节点的信息
				temp->pnext = node->pnext;//将当前节点的前一个节点和当前节点的后一个节点连接起来
				free(node);//释放当前节点
				linklist->length--;//链表长度减一
			}
			temp = temp->pnext;//当前指针偏移
		}
	}
}

//更改满足条件的节点内容
void Change_node(Linklist*linklist,char name1[],char name2[])
{
	//如果链表为空
	if (linklist->head==NULL)
	{
		printf("此链表没有内容!\n");
		return;//退出当前函数
	}
	Student* temp = linklist->head;//用临时指针保存头节点的信息
	while (temp!=NULL)
	{
		if (strcmp(temp->name,name1)==0)//更改满足条件的节点内容
		{
			strcpy(temp->name, name2);
		}
		temp = temp->pnext;//当前指针偏移
	}
}

//查找满足条件的内容
void Search_node(Linklist* linklist, char name[])
{
	//如果链表为空
	if (linklist->head == NULL)
	{
		printf("此链表没有内容!\n");
		return;//退出当前函数
	}
	Student* temp = linklist->head;//用临时指针保存头节点的信息
	while (temp != NULL)
	{
		if (strcmp(temp->name, name) == 0)//更改满足条件的节点内容
		{
			printf("班级:%d  姓名:%s  性别:%s 年龄:%d  成绩:%d\n", temp->class_, temp->name, temp->gender, temp->age, temp->score);
		}
		temp = temp->pnext;//当前指针偏移
	}
}

//输出显示链表内的数据
void Out_Linklist(Linklist*linklist)
{
	//如果链表为空
	if (linklist->head==NULL)
	{
		printf("此链表没有内容!\n");
		return;//退出当前函数
	}
	else
	{
		Student* temp = linklist->head;
		printf("此链表的内容为:\n");
		while (temp!=NULL)
		{
			printf("班级:%d  姓名:%s  性别:%s 年龄:%d  成绩:%d\n", temp->class_, temp->name, temp->gender, temp->age, temp->score);
			temp = temp->pnext;//当前指针偏移
		}
		printf("此时链表内存放了%d个数据!\n", linklist->length);
	}
}

//销毁链表
void Destroy_Linklist(Linklist* linklist)
{
	//如果链表为空
	if (linklist->head == NULL)
	{
		printf("此链表没有内容!\n");
		return;//退出当前函数
	}
	else
	{
		Student* temp = linklist->head;
		while (temp != NULL)
		{
			Student* node = temp;//定义一个临时指针保存当前节点的信息
			temp = temp->pnext;//当前指针偏移
			free(node);//释放当前节点
		}
		linklist->head= NULL;
		linklist->length = 0;
	}
}

void run(Linklist*linklist)
{
	int position;
	char name_o[20], name_n[20];
	Student data;
	printf("************************\n");
	printf("输入数字 0 表示从头部插入节点\n");
	printf("输入数字 1 表示从尾部插入节点\n");
	printf("输入数字 2 表示删除节点\n");
	printf("输入数字 3 表示更改节点数据\n");
	printf("输入数字 4 表示查询节点数据\n");
	printf("输入数字 5 表示销毁链表\n");
	printf("************************\n");
	printf("请输入一个数字:\n");
	int key;
	scanf("%d", &key);
	switch (key)
	{
	case 0://插入一个头节点
		printf("请输入需要插入的学生信息!\n");
		scanf("%d %s %s %d %d", &data.class_, data.name, data.gender, &data.age, &data.score);
		Push_head(linklist, data);
		Out_Linklist(linklist);
		break;
	case 1://插入一个尾节点
		printf("请输入需要插入的学生信息!\n");
		scanf("%d %s %s %d %d",  &data.class_, data.name, data.gender, &data.age, &data.score);
		Push_end(linklist,  data);
		Out_Linklist(linklist);
		break;
	case 2://删除一个节点
		printf("请输入需要删除的学生的名字\n");
		scanf("%s", name_o);
		Delete_node(linklist, name_o);
		Out_Linklist(linklist);
		break;
	case 3://更改一个节点数据
		printf("请输入需要更改的学生的名字和更改之后的名字!\n");
		scanf("%s %s", name_o, name_n);
		Change_node(linklist, name_o, name_n);
		Out_Linklist(linklist);
		break;
	case 4://查询一个节点数据
		printf("请输入需要查询的学生的名字!\n");
		scanf("%s", name_o);
		Search_node(linklist, name_o);
		break;
	case 5://销毁链表
		Destroy_Linklist(linklist);
		break;
	}
}

int main()
{
	Linklist* llp = linklist_init();
	while (true)
	{
		run(llp);
	}
	system("pause");
	return 0;
}

程序运行结果如下图
1
2
3
4
5

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值