链表(作业二)

要求:用链表实现学生信息管理系统

代码:

#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define MASZIZE 100		//管理系统可能达到的最大长度 
#define ERROR  0
#define OK	1
#define OVERFLOW -1
using namespace std;
void setmenu();
typedef int Status;

//学生信息结构体  
typedef struct
{	
	char num[20];	
	char name[20];	
	int  score; 
}Student;

//链表 
typedef struct LNode
{
	Student data;
	struct LNode *next;//节点的指针域 
}LNode,*Linklist;//Linklist为指向结构体LNode的指针类型
Linklist L;

//创建一个链表 
void Createlist()
{
	//构造一个空的单链表L
	L=new LNode;//生成新结点作为头结点 
	L->next=NULL;//头结点的指针域置空  
} 

//长度 
void Length()
{  
    Linklist p;  
    int ans=0;  
    p=L->next;  
    while(p)  
    {  
        ans++;  
        p=p->next;  
    }  
    printf("一共有%d学生\n",ans);   
}   

//取值
void Input(int m)
{
	int i;LNode *p;LNode *q; 
	q=L;
	for(i=0;i<m;i++)
	{
		p=new LNode;
		printf("学号:");
		cin>>p->data.num;
		printf("姓名:");
		cin>>p->data.name;
		printf("成绩:");
		cin>>p->data.score;
		p->next=NULL;
		q->next=p;
		q=p; 
	}
	printf("**输入成功**\n");
}

//
void Output()
{
	Linklist p;  
    p=L->next; 
	while(p)
	{
		cout<<"学号:"<<endl;
		cout<<p->data.num<<endl;
		cout<<"姓名:"<<endl;
		cout<<p->data.name<<endl;
		cout<<"成绩:"<<endl;
		cout<<p->data.score<<endl;
		p=p->next;
	}
}
//插入
Status ListInsert()
{
	int t; 
	printf("请输入要插入的位置:\n");
	scanf("%d",&t);
	Linklist p,q;
	int j=0;
	p=L; 
    while(p&&j<t-1)  
    {  
        p=p->next;  
        ++j;  
    } 
    if(!p||j>t-1)
    {
    	cout<<"输入错误,插入失败!!!"<<endl; 
    	return ERROR;
	}
    else
    {
    	q=new LNode;
	    printf("请输入学号:");  
	    scanf("%s",q->data.num);  
	    printf("请输入姓名:");  
	    scanf("%s",q->data.name);  
	    printf("请输入成绩:");  
	    scanf("%d",&q->data.score);
		q->next=p->next;   
	    p->next=q;  
	    printf("**插入成功**\n"); 
	}        
}

//删除
Status ListDelete()
{
	//在带头结点的单链表中,删除第i个元素
	int i;
	printf("请输入要删除的位置:\n");
	scanf("%d",&i);
	LNode *p;LNode *q;
	int j;
	p=L;j=0;
	q=new LNode;
	while((p->next)&&(j<i-1))//查找第i-1个结点,p指向该结点
	{
		p=p->next;++j;
	} 
	if(!(p->next)||(j>i-1))
	return ERROR;
	q=p->next;
	p->next=q->next;
	delete q;
	printf("删除成功\n"); 
} 
//查找 
LNode LocateElem()
{//在带头结点的单链表L中查找指定学号的元素
	printf("请输入您要查找的人的学号:\n");
	char numb[20]; int ans=0; 
    scanf("%s",numb);   
    LNode *p;
	p=L->next;//p指向首元结点 
	while(p)//顺链域向后扫描,直到p为空或p所指结点的数据域等于e
	{ 
		if((strcmp(p->data.num,numb)==0)) 
        {
        	printf("学号:%s\n",p->data.num);  
        	printf("姓名:%s\n",p->data.name);   
        	printf("成绩:%d\n",p->data.score);
        	ans=1;
			break;  
		}
		p=p->next;
	}
	if(!p)
	{
		cout<<"不存在此学生:"<<endl;
		
	}	
} 

int main()
{	
	int sum,n;
	//Student p;	
	printf("*************欢迎使用学生信息管理系统*************\n");	
	printf("输入[1]建一个新链表\n");	
	printf("输入[2]输入信息\n");
	printf("输入[3]查找给定的学生信息\n");
	printf("输入[4]输出所有学生信息\n");	
	printf("输入[5]插入信息\n");	
	printf("输入[6]删除信息\n");
	printf("输入[7]统计学生人数\n");	
	printf("输入[8]退出系统\n");	
	while(OK)	 
	{
	 	scanf("%d",&n);	 	
		switch(n)		 
		{		
		 	case 1:
			Createlist();
			printf("链表创建成功\n");break;
			case 2:		 	
			printf("请输入学生个数:\n");
			scanf("%d",&sum);
			Input(sum);
			break;		 	
			case 3:			
			LocateElem();break;
			case 4:
			Output();break;	
			case 5:			
			ListInsert();break;
			case 6:
			ListDelete();break;
			case 7:
			Length();
			break;
		case 8:
		  exit(0);			 
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值