我是靠谱客的博主 高挑汉堡,最近开发中收集的这篇文章主要介绍用栈完成学生信息管理删除和撤销(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("%sn",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("%sn",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("撤销的学生信息:%sn",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语言)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部