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