求人帮忙加个修改菜单!
/*-----------------------------------------
文件功能:实现了动态建立一个学生信息的链表包括链表的
创建、插入、删除、和打印输出学生信息
本链表是带有头结点的,头结点的内容为空内容
-----------------------------------------*/
/*-------------------------包含头文件------------------------------------*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
/*-------------------------结构体定义部分------------------------------*/
typedef struct Node
{
char name[10];
char sex[6];
char No[11];
int age;
struct Node *next;
}ListNode;
/*---------------------------函数实现部分-------------------------------*/
/*-----------------------------创建链表---------------------------------*/
/*在,建立链表链表的末端插入新的节点*/
ListNode *CreateList(int n) //自定义指针函数
{ //n:创建本次链表的人数
ListNode *head; //指向头结点指针
ListNode *p,*pre; //定义中间变量
int i;
head=(ListNode *)malloc(sizeof(ListNode)); //为头节点分配内存空间
head->next=NULL; //将头结点的指针域清空
pre=head; //先将头结点首地址赋给中间变量pre
for(i=1;i<=n;i++) //通过for循环不断加入新的结点
{
printf("请输入第%d学生姓名:",i); //打印出第几个人的名字
p=(ListNode *)malloc(sizeof(ListNode));/*为要插入的节点分配内存空间p指向
新插入结点的首地址*/
scanf("%s",&p->name); //输入姓名
printf("请输入第%d学生性别:",i);
scanf("%s",&p->sex);
printf("请输入第%d学生学号:",i);
scanf("%s",&p->No);
printf("请输入第%d学生年龄:",i);
scanf("%d",&p->age);
pre->next=p; //将p指向新结点插入链表也就是头结点指针域指向下个结点
//第一个结点就是p指向的,因为头结点内容为空
pre=p; //这个起着指向下一个结点的作用
}
p->next=NULL; //最后将最后一个结点的指针域清空了
return head; //返回本链表的首地址
}
/*-------------------------输出链表-----------------------------------*/
void PrintList(ListNode *h) //自定义打印函数
{
ListNode *p;
int n=0; //学生编号从0开始
p=h->next; //逐个指向下一个结点
while(p) //逐个打印结点
{
printf("\n\t\t%d %s %s %s %d",n,p->name,p->sex,p->No,p->age);
p=p->next;
n++;
printf("\n");
}
}
/*----------------------插入链表结点--------------------------*/
void InsertList(ListNode *h,int i,char name[],char sex[],char No[],int age,int n)
/* h:头结点地址 i:插入到第几个结点 name:插入结点的姓名
sex:插入结点的性别 No:插入结点的学号 age:插入结点的年龄
n:链表中结点的个数除下头结点外的个数 */
{
ListNode *q,*p; //先定义2个指向一个结点的指针
int j;
if(i<1 || i>n+1)
printf("Error! 请重新输入:\n");
else
{
j=0;
p=h; //将指针p指向要链表的头结点
while(j<i-1)
{
p=p->next;
j++;
}
q=(ListNode *)malloc(sizeof(ListNode)); //为要插入的结点分配内存空间
/*----赋值操作-----*/
strcpy(q->name,name); //将名字拷到要插入的节点内
strcpy(q->sex,sex);
strcpy(q->No,No);
q->age=age; //将要插入的节点中年龄赋值
/*---调整指针域----*/
q->next = p->next; /*这个是将新插入的结点指针域指向
上一个结点指针域指向的结点地址
即为p->next*/
p->next=q; /*将要插入结点位置前面的结点指针域
指向现在插入的结点首地址*/
}
}
/*---------------------------删除链表结点----------------------------*/
void DeleteList(ListNode *h, int i, int n)
/* h: 头结点地址 i:要删除的结点所在位置
n:链表中结点的个数除下头结点外的个数 */
{
ListNode *p,*q; //首先定义2个指向结点型结构体的指针
int j;
char name[10];
char sex[6];
char No[11];
int age;
if(i<1 || i>n) //如果位置超出了1和n的范围的话则打印出错误信息
printf("Error! 请重新输入:\n");
else //没有超出除头结点外的1到n 的范围的话那么执行删除操作
{
j=0;
p=h; //将指针指向链表的头结点首地址
while(j<i-1)
{
p=p->next;
j++;
}
q=p->next; /*q指向要删除的位置之前的那个结点指针域指向的
地址q指向的结点就是要删除的结点*/
p->next=q->next;/*这个就是将要删除的结点的前面那个结点
的指针域指向要删除的结点指针域中存放
的下个结点的首地址从而实现了删除第i个
结点 的作用*/
strcpy(name,q->name);
strcpy(sex,q->sex);
strcpy(No,q->No);
age=q->age;
free(q); //释放q指向的结点
printf("\n\t\t%s %s %s %d",name, sex, No, age);
}
}
/*--------------------------主函数-------------------------------*/
void main()
{
ListNode *h; //h指向结构体
int i = 1, n, age;
char name[11];
char sex[6];
char No[11];
while ( i )
{
/*输入提示信息*/
printf("\n");
printf("\n\t\t 学生信息管理系统 ");
printf("\n\t\t*************************");
printf("\n\t\t* 1---录入 *");
printf("\n\t\t* 2---添加 *");
printf("\n\t\t* 3---删除 *");
printf("\n\t\t* 4---显示 *");
printf("\n\t\t* 0---退出 *");
printf("\n\t\t*************************");
printf("\n\t\t请选择菜单号:");
scanf("%d",&i);
switch(i)
{
case 1:
printf("\n\t\t请输入本次要录入的人数:"); /*输入创建链表结点的个数*/
scanf("%d",&n);
h=CreateList(n); //创建链表
printf("\n\t\t本次录入的学生信息为:");
printf("\n\t\t编号 姓名 性别 学号 年龄");
PrintList(h);
break;
case 2:
printf("\n\t\t请输入需要插入的位置:");
scanf("%d",&i);
printf("\n\t\t请输入姓名:"); //输入需要插入学生的姓名
scanf("%s",name);
printf("\n\t\t请输入性别:");
scanf("%s",sex);
printf("\n\t\t请输入学号:");
scanf("%s",No);
printf("\n\t\t请输入年龄");
scanf("%d",&age);
InsertList(h,i,name,sex,No,age,n);
printf("\n\t\t添加成功\n\t\t"); //添加学生信息后,重新打印链表
printf("\n\t\t编号 姓名 性别 学号 年龄 \n\t\t");
PrintList(h);
break;
case 3:
printf("\n\t\t请输入要删除学生的编号:\n\t\t:");
scanf("%d",&i);
DeleteList(h, i, n);
printf("\n\t\t删除成功:\n\t\t");
printf("\n\t\t编号 姓名 性别 学号 年龄 \n\t\t");
PrintList(h); //删除学生信息后,重新打印链表
break;
case 4:
printf("全部学生信息如下: \n");
printf("\n\t\t编号 姓名 性别 学号 年龄 \n\t\t");
PrintList(h);
break;
case 0: //退出本系统
return;
break;
default:
printf("\n\t\tERROR!重试!\n\t\t");
}
}
}