数据结构(结课)

1、顺序表实现学生管理系统(参照顺序表技能)写出菜单界面switch选择,功能1创建顺序表(堆区),2录入学生信息,3插入一个学生信息,4删除一个学生信息,5按照位置修改一个学生信息,6、按照姓名顺序查找一个学生是否存在7、对学生年龄直接插入排序(从小到大)。

//mymain.c
#include"fun.h"
int main()
{
	Plink L=creat_stu();
	int n =0;
	while(1)
	{
		printf("\t====*学生管理系统*====\n");
		printf("\t====1.录入学生信息====\n");
		printf("\t====2.插入一个学生信息\n");
		printf("\t====3.删除一个学生信息\n");
		printf("\t====4.按照位置修盖信息\n");
		printf("\t====5.按照姓名查找学生\n");
		printf("\t====6.对学生年龄进行排序\n");
		printf("\t====0.退出系统=========\n");

        printf("请输入>>\n");
		scanf("%d",&n);
		switch(n)
		{
		case 1:  
				 input_stu(L,3);
				 output_stu(L);
				 break;
		case 2:
				 insert_pos(L);
				 output_stu(L);
				 break;
		case 3:
				 dele_pos(L);
				 output_stu(L);
				 break;
		case 4:
				 change_pos(L);
				 output_stu(L);
				 break;
		case 5:
				 find_name(L);
				 break;
		case 6:
				 str_insert(L);
				 output_stu(L);
				 break;
		case 0:
                printf("退出系统。\n");
                free(L);  // 释放动态分配的内存
                return 0;
        default:
                printf("无效的选项,请重新输入。\n");
                break;		 
	}
	}


	return 0;
}

 

//fun.c
#include"fun.h"
Plink creat_stu()
{
	Plink p=malloc(sizeof(Link));
	if(p==NULL)
	{
		printf("申请空间失败\n");
		return NULL;
	}
	p->len=0;
	memset(p->data,0,sizeof(p->data));
	return p;
}
void output_stu(Plink L)
{
	 printf("学生信息如下:\n");
    int i;
    for(i  =0;i<L->len;i++)
    {
        printf("年龄:%d\t姓名:%s\t成绩:%d\t号码:%s\n",
                L->data[i].age,L->data[i].name
                ,L->data[i].score,L->data[i].number);
    }
}
int input_stu(Plink L,int n)
{
    printf("请输入学生信息:\n");
    int i;
    for(i = 0;i<n;i++)
    {
        printf("请输入第%d个学生信息:\n",i+1);
        printf("请输入年龄:");
        scanf("%d",&L->data[i].age);
        printf("请输入姓名:");
        scanf("%s",L->data[i].name);
        printf("请输入成绩:");
        scanf("%d",&L->data[i].score);
		printf("请输入电话号码:");
		scanf("%s",L->data[i].number);
        L->len++;//计数器+1
    }
    return 0;
}
void insert_pos(Plink L)
{

    int pos; 
    stu e = {99,"老王",25,"34566"};//要插入的学生信息
    printf("请输入你要插入的位置:");
    scanf("%d",&pos);
    //位置小于1,大于len+1,数组溢出,表空
    if(pos<1||pos>L->len+1||L->len==MAX||L==NULL)
    {
        printf("插入失败\n");
    }
    else
    {
        int i;
        for(i = L->len-1;i>=pos-1;i--)
        {
            L->data[i+1] = L->data[i];
        }
        L->data[pos-1] = e;
        L->len++;
    }
}
void dele_pos(Plink L)
{
    int pos;
    printf("请输入你要删除的位置:");
    scanf("%d",&pos);
    if(pos<1||pos>L->len+1||L->len==MAX||L==NULL)
    {
        printf("删除失败\n");
    }
    else
    {
        int i;
        for(i = pos-1;i<L->len;i++)
        {
            L->data[i]  =L->data[i+1];
        }
        L->len--;
    }
}
void change_pos(Plink L)
{
    int pos;
    printf("请输入你要修改的位置:");
    scanf("%d",&pos);
   if(pos<1||pos>L->len+1||L->len==MAX||L==NULL)
    {
        printf("修改失败\n");
    }
    else
    {
         printf("修改成功\n");
        strcpy(L->data[pos-1].name,"张三");
    }
}
void find_name(Plink L)
{
     char  key[20];//定义字符数组类型变量
    printf("请输入要查找的学生姓名:");
    scanf("%s",key);
    int i,sub=-1;
    for(i  =0;i<L->len;i++)
    {
        if(strcmp(key,L->data[i].name)==0)
        {
            sub = i;//保留下标
        }
    }
    if(sub==-1)
    {
        printf("查找失败\n");
    }
    else
    {
        printf("查找成功,该学生在第%d个位置\n",sub+1);
    }
}
void str_insert(Plink L)
{
	int j;
	for(int i=1;i<L->len;i++)
	{
	  int t=L->data[i].age;
		for( j=i-1;j>=0;j--)
		{
			if(t<L->data[j].age)
			{
				stu temp=L->data[i];
				L->data[i]=L->data[j];
				L->data[j]=temp;
			}
			else
			{
				break;
			}
		}
		L->data[j+1].age=t;
	}
}

 

 

 

 

 2、单链表实现学生管理系统(参照顺序表技能)写出菜单界面switch选择,功能1创建单链表,2录入学生信息,3删除一个学生信息,4按照成绩修改一个学生的年龄,5、按照姓名顺序查找一个学生是否存在。

#include"link.h"
int main()
{
	Plink L=get_head();
	int n =0;
	while(1)
	{
		printf("\t====*学生管理系统*====\n");
		printf("\t====1.创建单链表======\n");
		printf("\t====2.录入学生信息====\n");
		printf("\t====3.删除一个学生信息\n");
		printf("\t====4.按照成绩修改年龄\n");
		printf("\t====5.按照姓名查找学生\n");
		printf("\t====0.退出系统========\n");

        printf("请输入>>\n");
		scanf("%d",&n);
		switch(n)
		{
			   
		case 2:
                for(int i=0;i<3;i++)
				{
					stu e;
        printf("请输入第%d个学生信息:\n",i+1);
        printf("请输入年龄:");
        scanf("%d",&e.age);
        printf("请输入姓名:");
        scanf("%s",e.name);
        printf("请输入成绩:");
        scanf("%d",&e.score);
		printf("请输入电话号码:");
		scanf("%s",e.number);
				 tail_insert(L,e);
				}
				 node_output(L);
				 break;
		case 3:
				 dele_pos(L);
				 node_output(L);
				 break;
		case 4:
				 value_find_change(L,12);
				 node_output(L);
				 break;
		case 5:
				 find_name(L);
				 break;
		case 0:
                printf("退出系统。\n");
                free(L);  // 释放动态分配的内存
                return 0;
        default:
                printf("无效的选项,请重新输入。\n");
                break;
	}
	}


	return 0;
#include"link.h"
Plink get_head()//申请头结点函数
{
    Plink p = malloc(sizeof(Link));//申请结构体大小空间
    if(p==NULL)
    {
        printf("申请头结点失败\n");
        return NULL;
    }
    p->len=0;
    p->next = NULL;//指针域赋值(只有一个头结点)
    return p;
}
int tail_insert(Plink L,stu e)
{
    if(L==NULL)
    {
        printf("单链表不存在\n");
        return -1;
    }
    //尾插法
    Plink t  =L;
    int i;
    for(i = 0;i<L->len;i++)
    {
        t = t->next;//将t指向最后一个节点
    }
    Plink p = malloc(sizeof(Link));//申请结构体大小空间
    p->data = e;

    t->next = p;
    p->next = NULL;
    L->len++;
    return 0;
}
int node_output(Plink L)//输出单链表
{
    if(L==NULL||L->len==0)
    {
        printf("单链表不存在或者为空\n");
        return -1;
    }
    int i;
    Plink t = L;//指向头结点
	printf("学生信息如下:\n");
    for(i = 0;i<L->len;i++)
    {
        t = t->next;
         printf("年龄:%d\t姓名:%s\t成绩:%d\t号码:%s\n",
                t->data.age,t->data.name
                ,t->data.score,t->data.number);
    }
}
int dele_pos(Plink L)//任意位置删除
{
    if(L==NULL||L->len==0)
    {
        printf("单链表不存在或者为空\n");
        return -1;
    }
    int i,pos=0;
    Plink t  =L;
    for(i  =0;i<pos-1;i++)//移动pos-1次指向待删除节点的前驱
    {
        t  =t->next;
    }
    Plink Q = t->next;//保留要删除的节点
    t->next = t->next->next;//删除
    L->len--;

    free(Q);
    Q=NULL;
    return 0;
}
int value_find_change(Plink L,int key)
{
    if(L==NULL||L->len==0)
    {
        printf("单链表不存在或者为空\n");
        return -1;
    }
    Plink t = L;
    int i,e,pos=-1;
    for(i = 0;i<L->len;i++)
    {
        t = t->next;
        if(key==t->data.score)
        {
            pos=i+1;//保留节点位置
            printf("查找成功,请输入要修改的值:");
            scanf("%d",&e);
            t->data.age = e;//修改
            break;
        }
    }
    if(pos==-1)
    {
        printf("不存在该节点值\n");
        return -1;
    }
    return 0;
}
void find_name(Plink L)
{
     char  key[20];//定义字符数组类型变量
    printf("请输入要查找的学生姓名:");
    scanf("%s",key);
    int i,sub=-1;
	Plink t =L;
    for(i  =0;i<L->len;i++)
    {
		t=t->next;
        if(strcmp(key,t->data.name)==0)
        {
            sub = i;//保留下标
        }
    }
    if(sub==-1)
    {
        printf("查找失败\n");
    }
    else
    {
        printf("查找成功,该学生在第%d个位置\n",sub+1);
    }
}

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值