链表的增删改查
#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指向下一行,实现持续输出
}
}
}
增加:
删:
改:
查:
增删改查: