永发信息网

用C++弄学生管理系统,要求有添加,删除,修改,查询,检索等功能.......

答案:1  悬赏:50  手机版
解决时间 2021-03-20 01:45
用C++弄学生管理系统,要求有添加,删除,修改,查询,检索等功能.......
最佳答案
链表

#include 
#include 
#define LEN sizeof(struct student)



//定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针 
struct student
{
long num;                //学号 
char name[128];            //姓名 
struct student *next;    //结构体指针 
};

typedef struct student * stuNode;

int n = 0;                    //全局变量,记录链表的长度 



stuNode Create();            //创建一个新的链表                     

void Print(stuNode head);    //通过传入的链表头指针打印整个链表 

stuNode Delete(stuNode head, int num);    //通过传入的链表头指针和学生学号删除节点 

stuNode Insert(stuNode head, stuNode newStu);    //依照学生学号的顺序向链表中插入新元素 




struct student *Create()
{
struct student *head, *p1, *p2;

//开辟一个LEN大小的空间,并让p1,p2指针指向它 
p2 = p1 = (struct student *)malloc(LEN);
//将头指针置为NULL 
head = NULL;

//创建链表节点并给节点的元素赋值 
printf("请输入学生的学号和姓名:");
scanf("%ld %s", &p1->num, p1->name);
while (p1->num != 0)
{
n = n + 1;
if (NULL == head)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (struct student *)malloc(LEN);
printf("请输入学生的学号和姓名:");
scanf("%ld %s", &p1->num, p1->name);
}
//将尾节点的指针置为NULL 
p2->next = NULL;
return head;
}


void Print(struct student *head)
{
struct student * p;
p = head;

//判断链表是否为空 
if (NULL == head)
{
printf("链表为空!
");
return ;
}
else
{
//循环打印链表中的元素 
printf("%d 个记录分别为:
", n);
while (p != NULL)
{
printf("%ld %s
", p->num, p->name);
//指针指向下一个节点 
p = p->next;
}
}
}


struct student *Delete(struct student * head, int num)
{
struct student *p1;
struct student *p2;
p1 = head;
//判断链表是否为空 
if (NULL == head)
{
printf("链表为空!
");
return head;
}
//遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
//如果找到相应节点,或者已经遍历到尾节点就跳出循环 
while (p1->num != num&&p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
//判断是否找到相应节点 
if (p1->num == num)
{
//要删除的节点是不是链表的第一个节点
//如果是,就将头指针指向该节点的后一个节点
//如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 
if (head == p1)
{
head = p1->next;
}
else
{
p2->next = p1->next;
}
n = n - 1;
printf("%ld 节点已删除.
", num);
}
else
{
printf("链表中没有要删除的元素.
");
}
return head;
}


struct student *Insert(struct student * head, struct student * newStu)
{
struct student *p0;
struct student *p1;
struct student *p2;
p0 = newStu;
p1 = head;
//判断链表是否为空,如果是空链表,就将新节点作为第一个节点 
if (NULL == head)
{
head = p0;
p0->next = NULL;
}
else
{
//遍历每一个节点中的学号,与新学号比较大小
//如果找到一个学号比新学号大,就将新学号的节点插入它之前 
//如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 
while ((p0->num > p1->num) && (p1->next != NULL))
{
p2 = p1;
p1 = p1->next;
}
//找到一个比新学号大的节点 
if (p0->num <= p1->num)
{
//判断该节点是否为头节点,如果是,则将新节点设置为头节点 
if (p1 == head)
{
head = p0;
}
else
{
p2->next = p0;
}
p0->next = p1;
}
else
{
p1->next = p0;
p0->next = NULL;
}
}
//链表长度加1 
n = n + 1;
printf("%ld 插入成功!
", newStu->num);
return head;
}

void main()
{
struct student *head;
struct student *stu;
int num;
head = Create();
Print(head);
printf("请输入要删除的学号:(结束)");
scanf("%ld", &num);
while (num != 0)
{
head = Delete(head, num);
Print(head);
printf("请输入要删除的学号:");
scanf("%ld", &num);
}
printf("请输入要插入的节点:");
stu = (struct student *)malloc(LEN);
scanf("%ld %s", &stu->num, stu->name);
while (stu->num != 0)
{
head = Insert(head, stu);
printf("请输入要插入的节点:");
stu = (struct student *)malloc(LEN);
scanf("%ld %s", &stu->num, stu->name);
}
Print(head);
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
熟牛肉粉丝包的做法
周易成语大全
秋熠这个地址在什么地方,我要处理点事
ask原则是什么?
洛神中的郭嬛最终结果
电视剧《悬崖》优酷、土豆全集在线观看悬崖DV
优酷解除了手机和邮箱的绑定,登不了了。怎么
为什么教会要爱以色列
对贫民来说,黑骑和圣骑士哪个更适合
ct报告中的左肺是人的哪边呀
电脑在哪设置密码
我公司捐赠1000元给慈善总会,会计分录
一个正方形的九字格有什么方法能使它纵向横向
问:如果有一天,你突然走好运捡到一块狗头金
我是16届考研生,在二本师范学院读自动化专业
推荐资讯
韵达快递(韵达快递)地址在什么地方,想过去办
妙香饭店这个地址在什么地方,我要处理点事
说人污什么意思
指纹打卡机怎样补考勤
我现在想死,谁能打个电话安慰我一下吗
小刚读一本书先读了全书的5分之2又读了全书的
如何刮仿瓷
电脑硬盘磁头未检测到是什么意思
苏州园区科技园附近的小区
穆善斋扁豆面旗子北门直营店地址在什么地方,
用电锅可以蒸米饭吗
问一个片的名字..一段剧情就是:第一人称 好
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?