链式存储.线性表.信息系统

/*
文件名:1_1_2_9.cpp
作者:汤善康
日期:2019年7月1日
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef int Status;
//采用线性表链式存储结构创建一个信息管理系统
typedef struct
{
long ID;
char name[10];
int grade;
}student;
typedef student elemtype;
//建立单链表存储结构的线性表
typedef struct Node
{
elemtype data;
struct Node next;
}Node;
typedef Node LinkList;
//录入学生信息
void Input(elemtype &L)
{
printf(“请输入学生ID:\n”);
scanf_s("%d", &L.ID);
printf(“请输入学生姓名:\n”);
scanf("%s", L.name);
printf(“请输入学生成绩:\n”);
scanf_s("%d", &L.grade);
}
//逆位序输入n个元素的值,建立带有头结点的单链线性表
void CreateListHead(LinkList &L, int n)
{
LinkList p;
int i;
elemtype a;//插入数据
L = (LinkList)malloc(sizeof(Node));
L->next = NULL;
for (i = 0; i < n; i++)//采用头插法循环插入元素
{
Input(a);//调用函数输入学生信息
p = (LinkList)malloc(sizeof(Node));
p->data = a;
p->next = L->next;
L->next = p;
}
}
//打印输出学生信息
void Output(elemtype &L)
{
printf("%8d%8s%8d\n", L.ID, L.name, L.grade);
}
//在第n个位置插入学生信息
Status ListInsert(LinkList &L, int n)
{
LinkList p,s;
int i;
//p = (LinkList)malloc(sizeof(Node));
p = L;
for (i = 1;p, i <= n - 1; i++)
{
p = p->next;
}
if (!p)return 0;//检查参数合法性,p为空返回0
else
{
s = (LinkList)malloc(sizeof(Node));//生成新的结点
Input(s->data);//调用输入函数输入新结点数据域的值
s->next = p->next;
p->next = s;//将新结点插入到L中
return 1;//插入成功,返回1
}
}
//删除第n个位置的学生的信息
Status Listdelete(LinkList &L, int n)
{
int i;
LinkList p,q;
p = L;
for (i = 1;p->next, i <= n - 1; i++)//寻找第n-1个结点
{
p = p->next;
}
if (p->next)//后继结点非空
{
q = p->next;
p->next = q->next;
return 1;//返回0
}
else//后继结点为空
return 0;//返回1
}
//统计学生总数
int Sum(LinkList &L)
{
int m;
LinkList p;
p = L;
m = 0;
while (p->next)
{
p = p->next;
m++;
}
return m;
}
int main()
{
LinkList rl,p;
int i;
int n;//元素个数
int a;//选择程序序号
int b;//要查找的学生序号
int c;//要插入学生信息的位置
int d;//要删除学生信息的位置
int sum;//统计学生总数
printf("
\n");
printf(“1.建立单链表\n”);
printf(“2.显示学生信息\n”);
printf(“3.查找学生信息\n”);
printf(“4.插入学生信息\n”);
printf(“5.删除学生信息\n”);
printf(“6.统计此时学生总数\n”);
printf("
**\n");
while (1)
{
printf(“请输入要选择的程序序号:\n”);
scanf("%d", &a);
switch (a)
{
case 1:
printf(“请输入要存入的学生信息数\n”);
scanf_s("%d", &n);
CreateListHead(rl, n);//调用函数建立单链表
break;
case 2:
p = rl;
for (i = 0; i < n; i++)
{
p = p->next;//使指针p指向下一结点
Output(p->data);//打印输出该结点处学生信息
}
break;
case 3:
p = rl;
printf(“请输入要查找的学生序号:”);
scanf("%d", &b);
for (i = 1; i <= b; i++)
{
p = p->next;
}

		Output(p->data);
		break;
	case 4:
		printf("请输入要插入学生信息的位置:");
		scanf("%d", &c);
		if (ListInsert(rl, c) == 1)//调用插入函数在第c个位置插入学生信息
		{
			n++;//学生人数n加一
			printf("成功插入\n");
		}
		else
			printf("插入失败\n");
		break;
	case 5:
		printf("请输入要删除学生信息的学生序号:");
		scanf("%d", &d);
		if (Listdelete(rl, d) == 1)
		{
			printf("成功删除该学生信息");
			n--;
		}
		else
			printf("删除失败");
		break;
	case 6:
		sum = Sum(rl);//调用函数计算学生总数
		printf("学生总数为:%d\n",sum);
		break;
	}
	
}

}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值