顺序表的练习

mymain.c

#include "list.h"
int main(int argc, const char *argv[])
{
	int k, ch;
	char aa[20], bb[20], cc[20];
	Plist L= create_list();
	printf("\t\t\t输入学生信息\n");
	input_list(L);
	output_list(L);
	while(1)
	{

		printf("\t\t\t1. 任意位置插入学生\n");
		printf("\t\t\t2. 任意位置删除学生\n");
		printf("\t\t\t3. 任意位置查找学生\n");
		printf("\t\t\t4. 任意位置修改学生\n");
		printf("\t\t\t5. 表头插入学生\n");
		printf("\t\t\t6. 表尾插入学生\n");
		printf("\t\t\t7. 表头删除学生\n");
		printf("\t\t\t8. 表尾删除学生\n");
		printf("\t\t\t9. 去除重复学生\n");
		printf("\t\t\t10. 按姓名查找学生并返回位置\n");
		printf("\t\t\t11. 按照学号从小到大排列顺序\n");
		printf("\t\t\t12. 按照学号查找返回学生位置\n");
		printf("\t\t\t13. 按年龄查找并修改\n");
		printf("\t\t\t14. 按位置查找并修改\n");
		scanf("%d", &ch);

		switch(ch)
		{
		case 1: 
			printf("请输入要插入的位置\n");
				scanf("%d", &k);
				printf("请输入学生信息");
				student s1;
				scanf("%d%s%s%d", &s1.id, s1.name, s1.major, &s1.age);
				insert_stu(L, k, s1);
				output_list(L); 
				break;
		case 2: 
				printf("请输入要删除的位置\n");
				scanf("%d", &k);
				delete_stu(L, k);
				output_list(L);
				break;
		case 3: 
				printf("请输入要查找的位置\n");
				scanf("%d", &k);
				search_stu(L, k);
				break;
		case 4: 
				printf("请输入要修改的位置\n");
				scanf("%d", &k);
				printf("请输入要修改的学生信息\n");
				student s2;
				scanf("%d%s%s%d", &s2.id, s2.name, s2.major, &s2.age);
				change_stu(L, k, s2);
				output_list(L);
				break;
		case 5: 
				printf("请输入要插入在表头的学生信息\n");
				student s3;
				scanf("%d%s%s%d", &s3.id, s3.name, s3.major, &s3.age);
				head_stu(L, s3);
				output_list(L);
				break;
		case 6: 
				printf("请输入要插入在表尾的学生信息\n");
				student s4;
				scanf("%d%s%s%d", &s3.id, s3.name, s3.major, &s3.age);
				tail_stu(L, s4);
				output_list(L);
				break;
		case 7: 
				headdel_stu(L);
				output_list(L);
				break;
		case 8: 
				taildel_stu(L);
				output_list(L);
				break;
		case 9: 
				del_rep(L);
				output_list(L);
				break;
		case 10: 
				printf("请输入要查找的学生姓名\n");
				scanf("%s", aa);
				printf("该学生的位置为:%d",search_name(L, aa));

		}
	}
	return 0;
}

list.c

#include "list.h"
Plist create_list()//生成链表
{
	Plist L = malloc(sizeof(list));
	if (NULL==L)
	{
		printf("申请内存空间失败\n");
		return NULL;
	}
	L->len = 0;  //学生列表长度,从0开始

	printf("申请成功\n");
	return L; //返回顺序表地址
}
int input_list(Plist L)
{
	int n;
	printf("要输入的学生个数为:");
	scanf("%d", &n);
	for(int i=0; i<n; i++)
	{
		printf("请输入第%d个学生的信息:", i+1);
		scanf("%d%s%s%d", &L->data[i].id, L->data[i].name, L->data[i].major, &L->data[i].age);
//		printf("输入第%d个学生的信息\n", i+1);
//		printf("请输入学生学号:");
//		scanf("%d", &L->data[i].id);	
//		printf("请输入学生姓名:");
//		scanf("%s", L->data[i].name);
//		printf("请输入学生专业:");
//		scanf("%s", L->data[i].major);
//		printf("请输入学生年龄:");
//		scanf("%d", &L->data[i].age);
		L->len++;//学生计数器
	}
}
int output_list(Plist L)//输出函数
{
	for(int i=0; i<L->len; i++)
	{
		printf("学号 %d\t 姓名 %s\t 专业 %s\t 年龄 %d\n", L->data[i].id, L->data[i].name, L->data[i].major, L->data[i].age);
//		L->data[i].id, L->data[i].name, L->data[i].major, L->data[i].age;
	}
	return 0;
}
int full(Plist L)//判满函数
{
	if(L->len==MAX)
	{
		return 1;
	}
	return 0;
}
int insert_stu(Plist L, int pos, student e)//插入函数
{
	int sub = pos-1;//下标等于位置-1
	if(sub<0||sub>L->len||L==NULL||full(L))//判定是否在正确区间
	{
		printf("插入失败");
		return -1;
			printf("请输入要插入在表头的学生信息\n");
			student s3;
			scanf("%d%s%s%d", &s3.id, s3.name, s3.major, &s3.age);
	}
	int i;
	for(i=L->len-1; i>=sub; i--)//循环移动元素
	{
		L->data[i+1]=L->data[i];
	}
	L->data[sub]=e;//插入新学生
	L->len++;//列表长度累加
	printf("插入成功\n");
	return 0;
}

int empty_stu(Plist L)//判断表为空
{
	if(L->len==0)
	{
		return 1;
	}
	return 0;
}

int delete_stu(Plist L, int pos)//删除函数
{
	int sub = pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty_stu(L))//
	{
		printf("删除失败\n");
		return -1;
	}
	for(int i=sub; i<L->len;i++)
	{
		L->data[i] = L->data[i+1];//循环移动元素
	}
	L->len--;
	printf("删除成功\n");

}

int search_stu(Plist L, int pos)
{
	int sub = pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty_stu(L))
	{
		printf("查找失败\n");
		return -1;
	}
	printf("该学生存在\n");
	printf("学号 %d\t 姓名 %s\t 专业 %s\t 年龄 %d\n", 
			L->data[sub].id, L->data[sub].name, 
			L->data[sub].major, L->data[sub].age);
	return 0;
}

int change_stu(Plist L, int pos, student f)
{
	int sub = pos-1;
	if(sub<0||sub>L->len-1||L==NULL||empty_stu(L))
	{
		printf("修改失败\n");
		return -1;
	}
	L->data[sub]=f;
	printf("修改成功\n");
	return 0;
}

int head_stu(Plist L, student g)
{
	int i;
	if(L==NULL||full(L))
	{
		printf("表头插入失败\n");
		return -1;
	}
	for(i=L->len-1; i>=0; i--)//循环移动元素
	{
		L->data[i+1]=L->data[i];
	}
	L->data[0]=g;//插入新学生
	L->len++;//列表长度累加
	printf("表头插入成功\n");
}

int tail_stu(Plist L, student h)
{
	int i;
	if(L==NULL||full(L))
	{
		printf("表尾插入失败\n");
		return -1;
	}
	L->data[L->len]=h;
	L->len++;
	printf("表尾插入成功\n");
}

int headdel_stu(Plist L)//删除函数
{
	if(NULL||empty_stu(L))//
	{
		printf("删除失败\n");
		return -1;
	}
	for(int i=0; i<L->len;i++)
	{
		L->data[i] = L->data[i+1];//循环移动元素
	}
	L->len--;
	printf("删除成功\n");
	return 0;

}int taildel_stu(Plist L)//删除函数
{
	if(NULL||empty_stu(L))//
	{
		printf("删除失败\n");
		return -1;
	}
	
	L->len--;
	printf("删除成功\n");
	return 0;
}

int del_rep(Plist L)
{
	int i, j;
	for(i=0; i<L->len; i++)
	{
		for(j=0; j<L->len; j++)
		{
			if(strcmp(L->data[i].name,L->data[j].name)==0)
			{
				delete_stu(L, j+1);
				j--;
				L->len--;
			}
		}
	}
	return 0;
}

int search_name(Plist L, char aa[20])
{
	int sub =-1;
	for(int i=0; i<L->len; i++)
	{
		if(strcmp(L->data[i].name,aa)==0)
		{
			sub = i+1;
		}
		if(sub==-1)
		{
			return -1;
		}
	}
	return sub;
}

list.h

#ifndef LIST_H_
#define LIST_H_
#include <myhead.h>
#define MAX 30
typedef struct//声明结构体
{
	int id; //学号
	char name[20]; //姓名
	char major[20]; //专业
	int age;//年龄
}student;

typedef struct
{
	student data[MAX];   //存放学生信息的数组
	int len; 	 //计算学生个数
}list, *Plist;
/***********函数声明***********/
Plist create_list();
int input_list(Plist);
int output_list(Plist);
int full(Plist);
int insert_stu(Plist, int, student);
int empty(Plist);
int delete_stu(Plist, int);
int search_stu(Plist, int);
int change_stu(Plist, int, student);
int head_stu(Plist, student);
int tail_stu(Plist, student);
int headdel_stu(Plist);
int taildel_stu(Plist);
int del_rep(Plist);
int search_name(Plist, char*);
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值