用栈完成学生信息管理删除和撤销(C语言)

Posted Ice丨shine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用栈完成学生信息管理删除和撤销(C语言)相关的知识,希望对你有一定的参考价值。

用链表储存学生信息
用栈临时保存删除学生信息,方便删除

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_SIZE 100
#define STACKINCREMENT 10
typedef struct LNode
        char name[20];//链表储存学生姓名
        struct LNode *next;
LNode,*LinkList;


typedef struct DelStu//储存删除学生信息
        int bottom;//底部位置
        int top;//顶部位置
        char data[100][100];//二维数组存储学生信息
DelStu;

DelStu *InitStack()//初始化

        DelStu *s=(DelStu*)malloc(sizeof(DelStu));//开辟空间
        if(s==NULL) return 0;
        s->bottom=s->top=0;
        return s;


void Push(DelStu *s,char e[])//将被删除的学生信息压入栈
       strcpy(s->data[s->top],e);
       s->top++;


void show(LNode *L)//遍历,显示学生姓名信息
        LNode *p;
        p=L->next;//重置p的指针
        printf("当前学生信息:");
        while(p!=NULL)
                printf("%s\\n",p->name);
                p=p->next;
        


void showDel(DelStu *stu)//查看删除的信息
        printf("下面显示被删除学生信息:");
        DelStu *p;
        p=stu;
        int a = p->top;//记录顶部
        //p->bottom=p->top=0;

        while(p->top!=p->bottom)//遍历栈
                printf("%s\\n",p->data[p->top-1]);
                p->top--;
        
        p->top=a;//将top放回原来的顶部
        return;


int Delete(LNode *L,char key[],DelStu *stu)//删除单链表中值为key的所有节点

        LNode *p = L,*q = L->next,*a;//记录节点L和下一个节点
        int i=0;
        while(q!=NULL)
                if(strcmp(q->name , key)==0)
                        p->next=q->next;
                        a=q;
                        Push(stu,key);//把被删除的信息压入栈
                        q=q->next;//先移动q再释放
                        free(a);
                        i++;
                
                else 
                        p=q;
                        q=q->next;
                
        
        if(i==0) 
                        printf("无此记录!");
                        return 1;//返回1标记无此记录
        
        return 0;




void undo(DelStu *stu,LNode *L)//出栈,撤销操作
        char *e;
        if(stu->top!=stu->bottom)//栈非空
                e=stu->data[stu->top-1];
                stu->top--;
                printf("撤销的学生信息:%s\\n",e);

                L->next = (LinkList)malloc(sizeof(LNode)); // 生成新结点并插入到表尾
                strcpy(L->next->name,e);//撤销操作
                L->next->next = NULL;
                return ;
        
        return ;





int main()

        LNode *L,*p;
        DelStu *stu=InitStack();//初始化栈
        L=(LNode*)malloc(sizeof(LNode));//创建链表
        L->next=NULL ;
        int i,n;
        printf("请输入要录入的学生个数:");
        scanf("%d",&n);//输入要输入的学生个数
        p = L;
        printf("请输入学生姓名:以回车结束\\n");
        for (i=n; i>=0; --i) 
                p->next = (LinkList)malloc(sizeof(LNode)); // 生成新结点并插入到表尾
                gets(p->next->name);//输入学生姓名
                p->next->next = NULL;
                p = p->next; // 向后移动指针
        
        show(L);


        printf("请输入需要删除的学生信息:");
        char key[20];
        gets(key);
        if(Delete(L,key,stu)==1) return 0;//删除指定学生并压入stu栈,如果没有这条记录则直接返回。
        showDel(stu);//展示删除的信息
        show(L);//展示删除之后剩余的学生信息
        undo(stu,p);//撤销删除操作并显示撤销的学生信息,传入p因为p此时在链表尾端
        show(L);//显示撤销后的学生信息

    return 0;


以上是关于用栈完成学生信息管理删除和撤销(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

学生成绩管理系统的c语言程序

用C语言做学生信息管理系统设计

c语言学生成绩管理系统

C语言学生信息管理系统未完成部分!

学生成绩管理系统 用C语言编写

c语言设计,编程实现学生基本信息管理程序