用栈完成学生信息管理删除和撤销(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语言)的主要内容,如果未能解决你的问题,请参考以下文章