链表的增删改查

链表的增删改查

#include <stdio.h>  
#include <stdlib.h>  
#define len  sizeof(preson)  //测结构体preson的长度,并定义常量,给后面的动态开辟空间提供方便;
union clas_position  //共用体:老师和学生的描述不同,学生用班级,老师用职位
{
int clas;
char position[20];
};
typedef struct presons  //定义preson的结构体
{
int num;       
char name[20]; 
char sex;      
char job[20];
union clas_position category;
struct presons *next;  //定义了preson的指针,动态链表的表示
}preson;
int n;  //全局变量:计算链表的行数
int main()
{
preson *lianbiao(void);                 //初始化输入链表函数
void add(preson *p);                    //增加链表内容函数
void remove(preson *p, preson *q); //删除链表内容函数
void change(preson *p); //改变链表内容函数
void find(preson*p); //查找链表内容函数
void print(preson *head); //链表输出函数
preson *head, *team,*p,*p1, *p2;        //head为头指针,team为保存要改变的指针的值,使通过增加和删除链表内容时链表可以再次相连
int i = 0, x, m, j, y = 1;
printf("Please enter some information:\n");
head = lianbiao();  //初始输入
printf("1:add  2:remove  3:change  4:find  5:exit\n"); //功能介绍
for (m = 1; m!=0; m++)  //循环确保可以重复对链表进行操作
{
printf("Please input the function you want to implement:");
scanf_s("%d", &i);  //输入一个控制功能的数字1~5之间
if (i == 1) //增加链表的内容
{
print(head); //输出一边所有链表
printf("Please input you want to increase after the number:");
scanf_s("%d", &x);  //输入想在第几项后面加内容
if (x > 0)
{
for (p = head, j = 1; j < x; j++) //使p指针指向你输入的第x行(x!=0)
p = p->next;
add(p); //在x后面加链表内容
print(head);
}
else if (x == 0)  //当输入x=0,则视为想要在开头前输入要增加的内容
{
y = 1;  //为了控制后面head指针的指向
team = head;  //保存原先的head所指向的地址
p1 = p2 = (preson*)malloc(len);
head = NULL;
scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
scanf_s("%s", p1->job, 20);
if (p1->job[0] == 's' || p1->job[0] == 'S')
scanf_s("%d", &p1->category.clas);
else if (p1->job[0] == 't' || p1->job[0] == 'T')
scanf_s("%s", p1->category.position, 20);
else printf("input error!");
while (p1->num != 0)  //以0结束输入的内容
{
n = n + 1;
if (y == 1) head = p1;  //此处控制head的指向
else p2->next = p1;
p2 = p1;
p1 = (preson*)malloc(len);
scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
scanf_s("%s", p1->job, 20);
if (p1->job[0] == 's' || p1->job[0] == 'S')//判断preson的身份是老师还是学生
scanf_s("%d", &p1->category.clas);
else if (p1->job[0] == 't' || p1->job[0] == 'T')
scanf_s("%s", p1->category.position, 20);
else printf("input error!");
y++;
}
p2->next = team;  //使输入的最后一个链表的next地址指向原先的head的地址
print(head);
}
else
{
printf("input error!");
break;
}
}
else if (i == 2)  //删除链表内容
{
printf("Please input you want to remove the item:");
scanf_s("%d", &x);  //输入想删除的链表行数
if (x > 1)
{
for (p = head, j = 1; j < x - 1; j++)  //使p指针指向你输入的第x行的前一行
p = p->next;
remove(p, p->next);//删除链表
print(head);
}
else if (x == 1)  //删除第一行
{
head = head->next;
n = n - 1;
print(head);
}
else
{
printf("input error!");
break;
}
}
else if (i == 3)   //更改链表内容
{
printf("Please input you want to change the item:");
scanf_s("%d", &x);  //输入要更改的行数
if (x > 0)
{
for (p = head, j = 1; j < x; j++)  //使p指针指向你输入的第x行
p = p->next;
change(p);  //改变当行的内容
print(head);
}
else
{
printf("input error!");
break;
}
}
else if (i == 4)  //查找链表内容
{
printf("Please input you want to find the item:");
scanf_s("%d", &x);  //输入想查看的行数
if (x > 0)
{
for (p = head, j = 1; j < x; j++)  //使p指针指向你输入的第x行
p = p->next;
find(p);  //找到当行,并打印出来
}
else
printf("input error!");
}
else if (i == 5)  //结束循环
break;
}
print(head);
system("pause");
return 0;
}


preson *lianbiao(void)  //初始输入动态链表函数
{
preson *head, *p1, *p2;
n = 0; 
p1 = p2 = (preson*)malloc(len);
head = NULL;
scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
scanf_s("%s", p1->job, 20);
if (p1->job[0] == 's' || p1->job[0] == 'S')      //判断preson的身份是老师还是学生
scanf_s("%d", &p1->category.clas);
else if (p1->job[0] == 't' || p1->job[0] == 'T')
scanf_s("%s", p1->category.position, 20);
else printf("input error!");
while (p1->num != 0)  //以0结束输入
{
n = n + 1;
if (n == 1) head = p1;
else p2->next = p1;
p2 = p1;
p1 = (preson*)malloc(len);
scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
scanf_s("%s", p1->job, 20);
if (p1->job[0] == 's' || p1->job[0] == 'S')
scanf_s("%d", &p1->category.clas);
else if (p1->job[0] == 't' || p1->job[0] == 'T')
scanf_s("%s", p1->category.position, 20);
else printf("input error!");
}
p2->next = NULL;  //使链表末尾指向空来结束
return head; //返回head指针给main函数,使得链表可以被找到
}


void add(preson *p) //链表增加内容函数
{
preson *p1, *p2, *team;
int y = 1;  //控制p->next的指向
team = p->next;  //保存p->next的值,使得增加的链表可以和原来的链接
p1 = p2 = (preson*)malloc(len);
scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
scanf_s("%s", p1->job, 20);
if (p1->job[0] == 's' || p1->job[0] == 'S')
scanf_s("%d", &p1->category.clas);
else if (p1->job[0] == 't' || p1->job[0] == 'T')
scanf_s("%s", p1->category.position, 20);
else printf("input error!");
while (p1->num != 0)
{
n = n + 1;
if (y==1) p->next = p1;
else p2->next = p1;
p2 = p1;
p1 = (preson*)malloc(len);
scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
scanf_s("%s", p1->job, 20);
if (p1->job[0] == 's' || p1->job[0] == 'S')
scanf_s("%d", &p1->category.clas);
else if (p1->job[0] == 't' || p1->job[0] == 'T')
scanf_s("%s", p1->category.position, 20);
else printf("input error!");
y++;
}
p2->next = team;//使增加的最后一个next指向原来的地址,实现链表链接
}


void remove(preson *p, preson *q) //链表删除函数
{
n = n - 1;
p->next = q->next;  //链表的删除只需要让它不背任何我们可利用的指针指向
}


void change(preson*p) //链表的更改函数
{
scanf_s("%d %s %c", &p->num, p->name, 20, &p->sex); //利用对该行的重新输入来实现更改
scanf_s("%s", p->job, 20);
if (p->job[0] == 's' || p->job[0] == 'S')
scanf_s("%d", &p->category.clas);
else if (p->job[0] == 't' || p->job[0] == 'T')
scanf_s("%s", p->category.position, 20);
else printf("input error!");
}


void find(preson*p)  //链表查找函数
{
printf("NO.        name       sex  job       class/position\n");
printf("%-10d %-10s %-4c %-10s", p->num, p->name, p->sex, p->job);
if (p->job[0] == 's' || p->job[0] == 'S')
printf("%-8d\n", p->category.clas);
else if (p->job[0] == 't' || p->job[0] == 'T')
printf("%-8s\n", p->category.position);
}


void print(preson *head)//链表的输出函数
{
preson *p = head;
printf("Having %d persons:\n", n);
if (head != NULL)  //保证head一定纯在
{
printf("NO.        name       sex  job       class/position\n");
while (p != NULL)
{
printf("%-10d %-10s %-4c %-10s", p->num, p->name, p->sex, p->job);
if (p->job[0] == 's' || p->job[0] == 'S')
printf("%-8d\n", p->category.clas);
else if (p->job[0] == 't' || p->job[0] == 'T')
printf("%-8s\n", p->category.position);
p = p->next;   //使p指向下一行,实现持续输出
}
}
}
#include <stdio.h>  
#include <stdlib.h>  
#define len  sizeof(preson)  //测结构体preson的长度,并定义常量,给后面的动态开辟空间提供方便;
union clas_position  //共用体:老师和学生的描述不同,学生用班级,老师用职位
{
	int clas;
	char position[20];
};
typedef struct presons  //定义preson的结构体
{
	int num;       
	char name[20]; 
	char sex;      
	char job[20];
	union clas_position category;
	struct presons *next;  //定义了preson的指针,动态链表的表示
}preson;
int n;  //全局变量:计算链表的行数
int main()
{
	preson *lianbiao(void);                 //初始化输入链表函数
	void add(preson *p);                    //增加链表内容函数
	void remove(preson *p, preson *q);		//删除链表内容函数
	void change(preson *p);					//改变链表内容函数
	void find(preson*p);					//查找链表内容函数
	void print(preson *head);				//链表输出函数
	preson *head, *team,*p,*p1, *p2;        //head为头指针,team为保存要改变的指针的值,使通过增加和删除链表内容时链表可以再次相连
	int i = 0, x, m, j, y = 1;
	printf("Please enter some information:\n");
	head = lianbiao();  //初始输入
	printf("1:add  2:remove  3:change  4:find  5:exit\n"); //功能介绍
	for (m = 1; m!=0; m++)  //循环确保可以重复对链表进行操作
	{
		printf("Please input the function you want to implement:");
		scanf_s("%d", &i);  //输入一个控制功能的数字1~5之间
		if (i == 1) //增加链表的内容
		{
			print(head); //输出一边所有链表
			printf("Please input you want to increase after the number:");
			scanf_s("%d", &x);  //输入想在第几项后面加内容
			if (x > 0)
			{
				for (p = head, j = 1; j < x; j++) //使p指针指向你输入的第x行(x!=0)
					p = p->next;
				add(p); //在x后面加链表内容
				print(head);
			}
			else if (x == 0)  //当输入x=0,则视为想要在开头前输入要增加的内容
			{
				y = 1;  //为了控制后面head指针的指向
				team = head;  //保存原先的head所指向的地址
				p1 = p2 = (preson*)malloc(len);
				head = NULL;
				scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
				scanf_s("%s", p1->job, 20);
				if (p1->job[0] == 's' || p1->job[0] == 'S')
					scanf_s("%d", &p1->category.clas);
				else if (p1->job[0] == 't' || p1->job[0] == 'T')
					scanf_s("%s", p1->category.position, 20);
				else printf("input error!");
				while (p1->num != 0)  //以0结束输入的内容
				{
					n = n + 1;
					if (y == 1) head = p1;  //此处控制head的指向
					else p2->next = p1;
					p2 = p1;
					p1 = (preson*)malloc(len);
					scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
					scanf_s("%s", p1->job, 20);
					if (p1->job[0] == 's' || p1->job[0] == 'S')//判断preson的身份是老师还是学生
						scanf_s("%d", &p1->category.clas);
					else if (p1->job[0] == 't' || p1->job[0] == 'T')
						scanf_s("%s", p1->category.position, 20);
					else printf("input error!");
					y++;
				}
				p2->next = team;  //使输入的最后一个链表的next地址指向原先的head的地址
				print(head);
			}
			else
			{
				printf("input error!");
				break;
			}
		}
		else if (i == 2)  //删除链表内容
		{
			printf("Please input you want to remove the item:");
			scanf_s("%d", &x);  //输入想删除的链表行数
			if (x > 1)
			{
				for (p = head, j = 1; j < x - 1; j++)  //使p指针指向你输入的第x行的前一行
					p = p->next;
				remove(p, p->next);//删除链表
				print(head);
			}
			else if (x == 1)  //删除第一行
			{
				head = head->next;
				n = n - 1;
				print(head);
			}
			else
			{
				printf("input error!");
				break;
			}
		}
		else if (i == 3)   //更改链表内容
		{
			printf("Please input you want to change the item:");
			scanf_s("%d", &x);  //输入要更改的行数
			if (x > 0)
			{
				for (p = head, j = 1; j < x; j++)  //使p指针指向你输入的第x行
					p = p->next;
				change(p);  //改变当行的内容
				print(head);
			}
			else
			{
				printf("input error!");
				break;
			}
		}
		else if (i == 4)  //查找链表内容
		{
			printf("Please input you want to find the item:");
			scanf_s("%d", &x);  //输入想查看的行数
			if (x > 0)
			{
				for (p = head, j = 1; j < x; j++)  //使p指针指向你输入的第x行
					p = p->next;
				find(p);  //找到当行,并打印出来
			}
			else
				printf("input error!");
		}
		else if (i == 5)  //结束循环
			break;
	}
	print(head);
	system("pause");
	return 0;
}

preson *lianbiao(void)  //初始输入动态链表函数
{
	preson *head, *p1, *p2;
	n = 0; 
	p1 = p2 = (preson*)malloc(len);
	head = NULL;
	scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
	scanf_s("%s", p1->job, 20);
	if (p1->job[0] == 's' || p1->job[0] == 'S')      //判断preson的身份是老师还是学生
		scanf_s("%d", &p1->category.clas);
	else if (p1->job[0] == 't' || p1->job[0] == 'T')
		scanf_s("%s", p1->category.position, 20);
	else printf("input error!");
	while (p1->num != 0)  //以0结束输入
	{
		n = n + 1;
		if (n == 1) head = p1;
		else p2->next = p1;
		p2 = p1;
		p1 = (preson*)malloc(len);
		scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
		scanf_s("%s", p1->job, 20);
		if (p1->job[0] == 's' || p1->job[0] == 'S')
			scanf_s("%d", &p1->category.clas);
		else if (p1->job[0] == 't' || p1->job[0] == 'T')
			scanf_s("%s", p1->category.position, 20);
		else printf("input error!");
	}
	p2->next = NULL;  //使链表末尾指向空来结束
	return head; //返回head指针给main函数,使得链表可以被找到
}

void add(preson *p) //链表增加内容函数
{
	preson *p1, *p2, *team;
	int y = 1;  //控制p->next的指向
	team = p->next;  //保存p->next的值,使得增加的链表可以和原来的链接
	p1 = p2 = (preson*)malloc(len);
	scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
	scanf_s("%s", p1->job, 20);
	if (p1->job[0] == 's' || p1->job[0] == 'S')
		scanf_s("%d", &p1->category.clas);
	else if (p1->job[0] == 't' || p1->job[0] == 'T')
		scanf_s("%s", p1->category.position, 20);
	else printf("input error!");
	while (p1->num != 0)
	{
		n = n + 1;
		if (y==1) p->next = p1;
		else p2->next = p1;
		p2 = p1;
		p1 = (preson*)malloc(len);
		scanf_s("%d %s %c", &p1->num, p1->name, 20, &p1->sex);
		scanf_s("%s", p1->job, 20);
		if (p1->job[0] == 's' || p1->job[0] == 'S')
			scanf_s("%d", &p1->category.clas);
		else if (p1->job[0] == 't' || p1->job[0] == 'T')
			scanf_s("%s", p1->category.position, 20);
		else printf("input error!");
		y++;
	}
	p2->next = team;//使增加的最后一个next指向原来的地址,实现链表链接
}

void remove(preson *p, preson *q) //链表删除函数
{
	n = n - 1;
	p->next = q->next;  //链表的删除只需要让它不背任何我们可利用的指针指向
}

void change(preson*p) //链表的更改函数
{
	scanf_s("%d %s %c", &p->num, p->name, 20, &p->sex); //利用对该行的重新输入来实现更改
	scanf_s("%s", p->job, 20);
	if (p->job[0] == 's' || p->job[0] == 'S')
		scanf_s("%d", &p->category.clas);
	else if (p->job[0] == 't' || p->job[0] == 'T')
		scanf_s("%s", p->category.position, 20);
	else printf("input error!");
}

void find(preson*p)  //链表查找函数
{
	printf("NO.        name       sex  job       class/position\n");
	printf("%-10d %-10s %-4c %-10s", p->num, p->name, p->sex, p->job);
	if (p->job[0] == 's' || p->job[0] == 'S')
		printf("%-8d\n", p->category.clas);
	else if (p->job[0] == 't' || p->job[0] == 'T')
		printf("%-8s\n", p->category.position);
}

void print(preson *head)//链表的输出函数
{
	preson *p = head;
	printf("Having %d persons:\n", n);
	if (head != NULL)  //保证head一定纯在
	{
		printf("NO.        name       sex  job       class/position\n");
		while (p != NULL)
		{
			printf("%-10d %-10s %-4c %-10s", p->num, p->name, p->sex, p->job);
			if (p->job[0] == 's' || p->job[0] == 'S')
				printf("%-8d\n", p->category.clas);
			else if (p->job[0] == 't' || p->job[0] == 'T')
				printf("%-8s\n", p->category.position);
			p = p->next;   //使p指向下一行,实现持续输出
		}
	}
}

增加:


删:


改:


查:


增删改查:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值