首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求人帮忙加个批改菜单

2013-07-04 
求人帮忙加个修改菜单!/*-----------------------------------------文件功能:实现了动态建立一个学生信息

求人帮忙加个修改菜单!

/*-----------------------------------------

文件功能:实现了动态建立一个学生信息的链表包括链表的
          创建、插入、删除、和打印输出学生信息
         本链表是带有头结点的,头结点的内容为空内容
-----------------------------------------*/
/*-------------------------包含头文件------------------------------------*/
#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");
    }
  }
}

热点排行