编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student{
	char id[20];
	char name[20];
	int age;
	struct Student *next;
}Stu;
//单链表的创建 (尾插法)
Stu *create(int n){
	Stu *head,*p,*tail;
	head=(Stu*)malloc(sizeof(Stu));
	head->next=NULL;
	tail=head;
	int i;
	printf("请输入需要添加学生的ID,名字,年龄:");
	for(i=0;i<n;i++)
	{
		p=(Stu*)malloc(sizeof(Stu));
		scanf("%s %s %d",p->id,p->name,&p->age);
		p->next=NULL;
		tail->next=p;
		tail=p;	
	}
	return head;
	
}
//单链表的输出 
void Print(Stu *head)
{
	Stu *p=head;
	p=p->next;
	printf("学生ID,名字,年龄:");
	while(p){
		printf("%s %s %d\n",p->id,p->name,p->age);
		p=p->next;
	}
}
//单链表的添加 
Stu *Add(Stu *head,Stu *x,int i)
{
	Stu *p=head;
	int j;
	for(j=0;j<i-1;j++){
		p=p->next;
	}
	x->next=p->next;
	p->next=x;
	return head;
}
//单链表的删除 
Stu *Delete(Stu *head,int i)
{
	Stu *p=head;
	int j;
	for(j=0;j<i-1;j++)
	{
		p=p->next;
	}
	Stu *q=p->next;
	p->next=q->next;
	free(q);
	return head;
}
//单链表节点数量 
void Length(Stu *head)
{
	int j=0;
	while(head->next){
		j++;
		head=head->next;
	}
	printf("%d",j);
}
//依据年龄进行删除 
Stu *DeleteAge(Stu *head,int age)
{
	Stu *p=head;
	while(p->next!=NULL){
		if(p->next->age==age)	
		{
			Stu *q=p->next;
			p->next=q->next;
			free(q);
		}else{
			p=p->next;
		}
	}
	return head;
}
//单链表的逆置 
void *reverse(Stu *head)
{
	Stu *pre,*p=head->next,*r=p->next;
 	p->next=NULL;
	while(r!=NULL)
	{
		pre=p;
		p=r;
		r=r->next;
		p->next=pre;
	}
	head->next=p;
	return head;
}
int main()
{
	int x1,x2;
	int n,i;
	int age;
	Stu *head=NULL;
	while(1){
		printf("请输入执行什么操作\n");
		printf("1.创建学生表\n2.输出学生信息\n3.添加学生信息\n4.删除学生信息\n5.学生数量\n6.逆置学生表\n");
		scanf("%d",&x1);
		switch(x1){
			case 1:
				printf("请输入需要添加学生的数量:");
				scanf("%d",&n);
				head=create(n);
				break;
			case 2:
				Print(head);
				break;
			case 3:
				printf("请输入需要添加的学生信息和位置:");
				printf("请输入需要添加学生的ID,名字,年龄:");
				Stu *x=(Stu*)malloc(sizeof(Stu)); 
				scanf("%s %s %d",x->id,x->name,&x->age);
				printf("请输入需要添加学生的位置:");
				scanf("%d",&i);
				Add(head,x,i);
				break;
			case 4:
				printf("请选择\n(1)依据学生位置进行删除\n(2)依据学生年龄进行删除\n");
				scanf("%d",&x2);
				if(x2==1){
					printf("请输入需要删除的信息位置:");
					scanf("%d",&i);
					Delete(head,i);
				}else{
					printf("\n请输入需要删除的年龄:");
					scanf("%d",&age);
					head=DeleteAge(head,age);
				}
				break;
			case 5:
				printf("学生数量:");
				Length(head);
				break;
			case 6:
				printf("逆置学生表:\n");
				head=reverse(head);
				break;
			default:
				printf("请输入指定操作\n");
				break;
		}
	}
	return 0;
}