单链表操作元素为结构体,实现增加,删除,查找,修改。

Posted 新时代键盘上的农民工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表操作元素为结构体,实现增加,删除,查找,修改。相关的知识,希望对你有一定的参考价值。

单链表操作元素为结构体,实现增加,删除,查找,修改。
源代码:

/*
* 
* author:xwq
* date:2021/9/28     21:21
* description:单链表操作的元素为结构体,实现增加,删除,查找,修改。
*
*/

#include<stdio.h>
#include<malloc.h>
#include<string>
#pragma warning(disable:4996)

typedef struct Student 
{
	char name[12];
	int age;
	char address[50];
}Elemtype;

typedef struct Man {
	Student data;
	struct Man* next;
}Man,*LinkMan;


void main_menu(LinkMan L);
//初始化单链表
int InitLink(LinkMan *L);
//插入元素
int InsertLink(LinkMan L, int i, Elemtype* e);
//删除某个节点
int DeleteLink(LinkMan L, int &i);
//查找某个节点
int SearchLink(LinkMan L, const int& i);
//修改某个节点的值
int UpdateLink(LinkMan L, int& i);
//打印单链表
int PrintLink(LinkMan L);


//主函数
int main(void)
{
	int result(0);
	Student e;
	LinkMan L=NULL;
	printf("*************************[菜鸟到底有多菜]********************************************\\n");
	printf("**********本软件学生信息结构体,姓名占12个字节,地址50个字节,请勿超出!!!****************\\n");
	result=InitLink(&L);
	if (result) printf("初始化成功\\n");
	else  printf("初始化失败\\n");
	printf("请输入要插入元素的个数;");
	scanf("%d", &result);
	printf("请输入插入节点的元素:\\n");
	for (int i = 1; i <= result; i++)
	{
		printf("请输入学生姓名:");
		scanf("%s",&e.name);
		printf("请输入学生年龄:");
		scanf("%d", &e.age);
		printf("请输入学生家庭地址:");
		scanf("%s", &e.address);
		InsertLink(L,i, &e);
	}
	main_menu(L);
	return 0;
}

//主菜单
void main_menu(LinkMan L)
{
	int id,position;
	Elemtype e;
	printf("请选择要进行的操作(0 退出本软件  1打印整个链表  2查找某个位置的节点  3删除某个节点  4修改某个节点  5插入某个节点):");
	scanf("%d", &id);
	switch (id)
	{
	case 0:
		printf("bye~,欢迎下次继续使用");
			break;
	case 1:
		printf("打印所有节点的结果;\\n");
		PrintLink(L);
		main_menu(L);
		break;
	case 2:
		printf("请输入要查找的节点的位置:");
		scanf("%d", &position);
		SearchLink(L, position);
		main_menu(L);
		break;
	case 3:
		printf("请输入要删除的节点位置:");
		scanf("%d", &position);
		DeleteLink(L, position);
		main_menu(L);
		break;
	case 4:
		printf("请输入要修改的节点位置:");
		scanf("%d", &position);
		UpdateLink(L, position);
		main_menu(L);
		break;
	case 5:
		printf("请输入要插入的节点位置:");
		scanf("%d", &position);
		printf("请输入学生姓名:");
		scanf("%s", &e.name);
		printf("请输入学生年龄:");
		scanf("%d", &e.age);
		printf("请输入学生家庭地址:");
		scanf("%s", &e.address);
		InsertLink(L, position, &e);
		main_menu(L);
		break;
	default:
		break;
	}

}




//初始化单链表
int InitLink(LinkMan *L)
{
	Man *head = (Man*)malloc(sizeof(Man));
	if (!head)
	{
		printf("初始化失败\\n"); return 0;
	}
	head->next = NULL;
	*L = head;
	return 1;
}

//插入元素
int InsertLink(LinkMan L, int i, Elemtype* e)
{
	if (i < 1 || e == NULL)
	{
		printf("插入的位置或者元素为空\\n");
		return 0;
	}
	Man* temp = (Man*)malloc(sizeof(Man));
	if (temp==NULL)
	{
		printf("内存分配新节点失败\\n");
	}
	memcpy(temp, e, sizeof(Elemtype));
	LinkMan p = L;
	int k = 0;
	while (p!=NULL&&k<i-1)
	{
		p = p->next;
		k++;
	}
	if (p == NULL)
	{
		printf("插入的位置不合法,前面的节点为空节点\\n");
		return 0;
	}
	else
	{
		p->next = temp;
		temp->next = NULL;
	}
	return 1;
}


//删除某个节点
int DeleteLink(LinkMan L, int& i)
{
	if (i < 1)
	{
		printf("删除的位置输入错误,应该为>1的数\\n");
		return 0;
	}
	LinkMan p = L;
	int k = 0;
	while (p != NULL && k < i - 1)
	{
		p = p->next;
		k++;
	}
	if (p->next == NULL)
	{
		printf("删除的位置超过了表长\\n");
		return 0;
	}
	else
	{
		LinkMan temp = p->next;
		p->next = p->next->next;
		free(temp);
	}
	return 1;
}


//查找某个节点
int SearchLink(LinkMan L,const int& i)
{
	if(i<1)
	{
		printf("查找的位置输入错误,应该为>1的数\\n");
		return 0;
	}
	LinkMan p = L;
	int k = 0;
	while (p!=NULL&&k<i)
	{
		p = p->next;
		k++;
	}
	if (!p)
	{
		printf("查找的位置超过了表长\\n");
		return 0;
	}
	else
	{
		printf("学生的姓名:%3s, 学生的年龄:%3d, 学生的家庭地址:%3s\\n", p->data.name, p->data.age, p->data.address);
		return 1;
	}


}


//修改某个节点的值
int UpdateLink(LinkMan L, int& i)
{
	if (i < 1)
	{
		printf("删除的位置输入错误,应该为>1的数\\n");
		return 0;
	}
	LinkMan p = L;
	int k =0;
	while (p!=NULL&&k<i)
	{
		p = p->next;
		k++;
	}
	if (p==NULL)
	{
		printf("修改的位置超过了表长\\n");
		return 0;
	}
	Elemtype e;
	printf("请输入修改后学生姓名:");
	scanf("%s", &e.name);
	printf("请输入修改后学生年龄:");
	scanf("%d", &e.age);
	printf("请输入修改后学生家庭地址:");
	scanf("%s", &e.address);
	memcpy(p, &e, sizeof(Elemtype));
	return 1;
}


//打印单链表
int PrintLink(LinkMan L)
{
	LinkMan p = L->next;
	if (!p) {
		printf("这是一个空表\\n");
		return 0;
	}
	while (p!=NULL)
	{
		printf("学生的姓名:%3s, 学生的年龄:%3d, 学生的家庭地址:%3s\\n",p->data.name,p->data.age,p->data.address);
		p = p->next;
	}
	return 1;
}

运行结果:

以上是关于单链表操作元素为结构体,实现增加,删除,查找,修改。的主要内容,如果未能解决你的问题,请参考以下文章

单链表操作元素为结构体,实现增加,删除,查找,修改。

单链表操作元素为结构体,实现增加,删除,查找,修改。

单链表操作元素为整型的实现增加,删除,查找,修改。

单链表操作元素为整型的实现增加,删除,查找,修改。

单链表操作元素为整型的实现增加,删除,查找,修改。

单链表操作元素为整型的实现增加,删除,查找,修改。