1.头文件
#ifndef __WORK__
#define __WORK__
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef struct Stu
{
char name[12];
int num;
}st,*Stu_p;
typedef struct stu
{
Stu_p arr[MAX];
int len;
}stu,*stu_p;
//创建顺序表
void* creat();
//判满
int fill(stu_p P);
//判空
int empty(stu_p P);
//增加学生元素
int add_stu(stu_p P,char name1[],int num1);
//按位置插入
int add_index(stu_p P,int index,char name1[],int num1);
//按位置删除
int dele_index(stu_p P,int index);
//修改
int change(stu_p P,int index,char name1[],int num1);
//按学号查找
int find(stu_p P,int num1);
//去重
int rm(stu_p P);
//输出
void show(stu_p P);
//释放顺序表
void release(stu_p *p);
#endif
2.功能函数
#include "work.h"
//创建顺序表
void* creat()
{
stu_p P=(stu_p)malloc(sizeof(stu));
if(P==NULL)
{
printf("堆区空间申请失败\n");
return NULL;
}
P->len=0;
for(int i=0;i<MAX;i++)
{
P->arr[i]=(Stu_p)malloc(sizeof(st));
memset(P->arr[i]->name,0,sizeof(P->arr[i]->name));
P->arr[i]->num=0;
}
printf("顺序表创建成功\n");
return P;
}
//判满
int fill(stu_p P)
{
if(P==NULL)
{
printf("参数传入失败\n");
return 1;
}
if(P->len==MAX)
{
printf("顺序表已满\n");
return 1;
}
else
{
return 0;
}
}
//判空
int empty(stu_p P)
{
if(P==NULL)
{
printf("参数传入失败\n");
return -1;
}
if(P->len==0)
{
printf("顺序表为空\n");
return 1;
}
else
{
return 0;
}
}
//增加学生元素
int add_stu(stu_p P,char name1[],int num1)
{
if(P==NULL)
{
printf("参数传入失败\n");
return -1;
}
if(fill(P))
{
return 0;
}
strcpy(P->arr[P->len]->name,name1);
P->arr[P->len]->num=num1;
P->len++;
return 1;
}
//按位置插入
int add_index(stu_p P,int index,char name1[],int num1)
{
if(P==NULL)
{
printf("参数传入失败\n");
return -1;
}
if(fill(P))
{
return 0;
}
if(index<1||index>P->len+1)
{
printf("传入位置不合法\n");
return 0;
}
index--;
Stu_p temp=P->arr[P->len];
for(int i=P->len;i>index;i--)
{
P->arr[i]=P->arr[i-1];
}
P->arr[index]=temp;
strcpy(P->arr[index]->name,name1);
P->arr[index]->num=num1;
P->len++;
return 1;
}
//按位置删除
int dele_index(stu_p P,int index)
{
if(P==NULL)
{
printf("参数传入失败\n");
return -1;
}
if(empty(P))
{
return 0;
}
if(index<1||index>P->len)
{
printf("传入位置不合法\n");
return 0;
}
index--;
Stu_p tem=P->arr[index];
for(int i=index;i<P->len;i++)
{
P->arr[i]=P->arr[i+1];
}
P->arr[P->len]=tem;
P->len--;
return 1;
}
//修改
int change(stu_p P,int index,char name1[],int num1)
{
if(P==NULL)
{
printf("参数传入失败\n");
return -1;
}
if(index<1||index>P->len)
{
printf("传入位置不合法\n");
return 0;
}
index--;
P->arr[index]->num=num1;
strcpy(P->arr[index]->name,name1);
return 1;
}
//按学号查找
int find(stu_p P,int num1)
{
if(P==NULL)
{
printf("参数传入失败\n");
return -1;
}
int flag=1;
for(int i=0;i<P->len;i++)
{
if(P->arr[i]->num==num1)
{
printf("已找到学号为%d学生:%s\n",num1,P->arr[i]->name);
flag=0;
return 1;
}
}
if(flag)
{
printf("未找到\n");
return 0;
}
}
//去重
int rm(stu_p P)
{
if(P==NULL)
{
printf("参数传入失败\n");
return -1;
}
for(int i=0;i<P->len;i++)
{
for(int j=i+1;j<P->len;j++)
{
if(P->arr[i]->num==P->arr[j]->num)
{
dele_index(P,j+1);
j--;
}
}
}
return 1;
}
//输出
void show(stu_p P)
{
if(P==NULL)
{
printf("参数传入失败\n");
return ;
}
for(int i=0;i<P->len;i++)
{
printf("姓名:%s 学号:%d\n",P->arr[i]->name,P->arr[i]->num);
}
putchar(10);
}
//释放顺序表
void release(stu_p *p)
{
if(*p==NULL)
{
printf("参数传入失败\n");
return;
}
for(int i=0;i<MAX;i++)
{
free((*p)->arr[i]);
}
free(*p);
*p=NULL;
}
3.主函数
#include "work.h"
int main()
{
stu_p H=creat();
add_stu(H,"qq",12);
add_stu(H,"ww",13);
add_stu(H,"ww",13);
add_stu(H,"ww",13);
add_stu(H,"ee",14);
add_stu(H,"ee",24);
add_stu(H,"ee",14);
add_stu(H,"rr",15);
show(H);
rm(H);
show(H);
add_index(H,3,"bb",21);
show(H);
dele_index(H,1);
show(H);
change(H,4,"ss",31);
show(H);
find(H,14);
release(&H);
return 1;
}
实现效果