#include<stdio.h>
#include<stdlib.h>
#define head H
typedef struct student
{
int id ;
char name[20];
int age;
struct student *next;
}stu;
void creat(stu *H);//增
bool Delete(stu *H,int id);//删
bool change(stu*H,int id);//改
bool select(stu *H,int id);//查
void output(stu *H);//输
void creat(stu *H) //增加节点的函数
{
int n;
printf("请输入要增加的个数:");
scanf("%d",&n);//要增加的个数
stu *p=H;
for(int i=0;i<n;i++)
{
p->next=(stu*)malloc(sizeof(stu));//创建新的节点
p=p->next; //此时p还指向head 故要移动
scanf("%d %s %d",&p->id,p->name,&p->age);//向节点内输入数据
p->next=NULL;//赋空
}
}
void output(stu *H)//输出节点的函数
{
stu *p=H->next;
while(p!=NULL)
{
printf("%d %s %d\n",p->id,p->name,p->age);
p=p->next;//指针移动
}
printf("数据已全部输出!");
}
bool select(stu *H,int id)//查找函数
{
stu *p=H->next;
while(p!=NULL)
{
if(p->id == id)
{
return true;
}
p=p->next;
}
return false;
}
bool change(stu*H,int id)//改动数据内容的函数
{
stu *p=H->next;
while(p!=NULL)
{
if(p->id == id)
{
scanf("%d %s %d",&p->id,p->name,&p->age);
return true;
}
p=p->next;
}
return false;
}
bool Delete(stu *H,int id)//删除数据的函数
{
stu *p=H->next;
stu *q=H;
/*用两个指针移动,当后面的内个指针找到的时候
就把前面的内个指针指向后面指针所指向的地方
再把找到所指的地方删掉 */
while(p!=NULL)
{
if(p->id==id)
{
q->next=p->next;
free(p);
return true;
}
q=q->next;
p=p->next;
}
return false;
}
int main()
{
stu *H=(stu*)malloc(sizeof(stu));//开辟链表的头
H->next=NULL;//赋空
creat(H);
int id;
printf("请输入要查询的id:");
scanf("%d",&id);
if(select(H,id))
{
printf("该id存在!\n");
}
else
{
printf("未查询到此id!\n");
}
printf("请输入要改动的id:");
scanf("%d",&id);
if(change(H,id))
{
printf("数据改动成功!\n");
}
else
{
printf("数据改动失败!\n");
}
printf("请输入要删除的id:");
scanf("%d",&id);
if(Delete(H,id))
{
printf("数据删除成功!\n");
}
else
{
printf("数据删除失败!\n");
}
output(H);
return 0;
}
单链表的增,删,查,改,输出数据
最新推荐文章于 2021-03-01 22:13:25 发布