头文件
#ifndef _STUDENT_H_
#define _STUDENT_H_
#define MAX 40
typedef char datatype;
typedef struct
{
datatype name[MAX];
datatype sex;
double score;
double height;
}stu;
typedef struct
{
stu data[MAX];
int len;
}Class,*ClassPtr;
//创建顺序表
ClassPtr list_create();
//判满
int list_full(ClassPtr C);
//判空
int list_empty(ClassPtr C);
//添加数据
int list_add(ClassPtr C,stu s);
//输入数据
stu list_input();
//顺序表的遍历
void list_show(ClassPtr C);
//顺序表任意位置插入数据
int list_add_pos(ClassPtr C,int pos,stu s);
//任意位置删除数据
int list_delete(ClassPtr C,int pos);
//按位修改
int list_updata_pos(ClassPtr C,int pos,stu s);
//按元素查找位置
int list_search_value(ClassPtr C,stu s);
//按值修改函数
int list_updata_value(ClassPtr,stu old_s,stu new_s);
//判断两数是否相等
int list_eq(stu s,stu s1);
//查找指定位置上的元素
stu *list_search_pos(ClassPtr C,int pos);
//去重
void list_unique(ClassPtr C);
//释放
void list_free(ClassPtr C);
#endif
源文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"
//创建顺序表
ClassPtr list_create()
{
//申请空间
ClassPtr C =(ClassPtr)malloc(sizeof(Class));
//判断是否申请成功
if(NULL==C)
{
printf("创建失败\n");
return NULL;
}
//清空顺序表
memset(C->data,0,sizeof(C->data));
C->len=0;
printf("顺序表创建成功\n");
return C;
}
//判满
int list_full(ClassPtr C)
{
//判断是否合法
if(NULL==C)
{
printf("顺序表不合法\n");
return 0;
}
//判断是否已经满了
return C->len == MAX;
}
//判空
int list_empty(ClassPtr C)
{
//判断是否合法
if(NULL==C)
{
printf("顺序表不合法\n");
return 0;
}
//判断是否为空
return C->len ==0;
}
//输入数据
stu list_input()
{
stu s;
printf("name:");
scanf(" %s",s.name);
printf("sex:");
scanf(" %c",&s.sex);
printf("score:");
scanf(" %lf",&s.score);
printf("height:");
scanf(" %lf",&s.height);
return s;
}
//添加数据
int list_add(ClassPtr C,stu s)
{
//判断是否合法
if(NULL==C || list_full(C))
{
printf("添加失败\n");
return 0;
}
//添加数据
s=list_input();
C->data[C->len]=s;
C->len++;
printf("添加成功\n");
return 1;
}
//顺序表的遍历
void list_show(ClassPtr C)
{
//判断是否合法
if(NULL==C || list_empty(C))
{
printf("遍历失败\n");
return ;
}
//遍历逻辑
printf("姓名\t性别\t分数\t身高\n");
for(int i=0;i<C->len;i++)
{
printf("%s\t%c\t%.1lf\t%.2lf\n",C->data[i].name,\
C->data[i].sex,\
C->data[i].score,\
C->data[i].height);
}
}
//顺序表任意位置插入数据
int list_add_pos(ClassPtr C,int pos,stu s)
{
//判断是否合法
if(NULL==C || list_full(C)||pos<0 || pos>C->len+1)
{
printf("插入失败\n");
return 0;
}
//插入位置的数据和后面的数据向后移一位
for(int i=C->len-1;i>=pos-1;i--)
{
C->data[i+1]=C->data[i];
}
//输入要插入的数据
s=list_input();
//插入数据
C->data[pos-1]=s;
//长度变化
C->len++;
printf("插入成功\n");
}
//任意位置删除数据
int list_delete(ClassPtr C,int pos)
{
//判断是否合法
if(NULL==C || list_empty(C)||pos<0 || pos>C->len)
{
printf("删除失败\n");
return 0;
}
//删除数据
for(int i=pos;i<C->len;i++)
{
C->data[i-1]=C->data[i];
}
//长度变化
C->len--;
printf("删除成功\n");
return 1;
}
//按位修改
int list_updata_pos(ClassPtr C,int pos,stu s)
{
//判断是否合法
if(NULL==C || list_empty(C)||pos<0 || pos>C->len)
{
printf("修改失败\n");
return 0;
}
//修改数据
C->data[pos-1]=s;
printf("修改成功\n");
return 1;
}
//判断两数是否相等
int list_eq(stu s,stu s1)
{
//判断逻辑
if(strcmp(s.name,s1.name)==0&&s.sex==s1.sex&&s.score==s1.score&&s.height==s1.height)
{
//是返回1
return 1;
}
return 0;
}
//按元素查找位置
int list_search_value(ClassPtr C,stu s)
{
//判断是否合法
if(NULL==C || list_empty(C))
{
printf("查找失败\n");
return -1;
}
//查找元素
for(int i=0;i<C->len;i++)
{
if(list_eq(C->data[i],s))
{
//输出位置
return i;
}
}
printf("没有这个数据\n");
return -1;
}
//按值修改函数
int list_updata_value(ClassPtr C,stu old_s,stu new_s)
{
//判断是否合法
if(NULL==C || list_empty(C)|| list_eq(old_s,new_s))
{
printf("修改失败\n");
return 0;
}
//定义下标
int index=-1;
//修改逻辑
while( (index=list_search_value(C,old_s)) >=0)
{
list_updata_pos(C,index+1,new_s);
}
return 1;
}
//查找指定位置上的元素
stu *list_search_pos(ClassPtr C,int pos)
{
//判断是否合法
if(NULL==C || list_empty(C)||pos<0 || pos>C->len)
{
printf("查找失败\n");
return 0;
}
//返回元素
return &C->data[pos-1];
}
//去重
void list_unique(ClassPtr C)
{
//判断逻辑
if(NULL==C || C->len<=1)
{
printf("去重失败\n");
return ;
}
//去重逻辑
for(int i=0; i<C->len; i++)
{
//将当前元素后面的所有元素遍历一遍
for(int j=i+1; j<C->len;j++)
{
if(list_eq(C->data[i],C->data[j]))
{
//删除j这个元素
list_delete(C, j+1);
j--; //防止漏删
}
}
}
}
//释放
void list_free(ClassPtr C)
{
//判断逻辑
if(NULL!=C)
{
free(C);
C=NULL;
}
printf("释放成功\n");
}
主文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"student.h"
int main(int argc, const char *argv[])
{
int a,pos=-1;
ClassPtr C=NULL;
stu s,s1;
while(1)
{
printf("创建1,添加2,遍历3,任意位置插入4,任意位置删除5,按位修改6,按值修改7,去重8,释放9:");
scanf(" %d",&a);
switch(a)
{
case 1:
C=list_create();
if(NULL==C)
{
printf("创建失败\n");
}
break;
case 2:
list_add(C,s);
break;
case 3:
list_show(C);
break;
case 4:
printf("输入要插入的位置:");
scanf(" %d",&pos);
list_add_pos(C,pos,s);
break;
case 5:
printf("输入要删除的位置:");
scanf(" %d",&pos);
list_delete(C,pos);
break;
case 6:
printf("输入要修改的位置:");
scanf(" %d",&pos);
printf("修改的信息:\n");
s=list_input();
list_updata_pos(C,pos,s);
break;
case 7:
printf("输入旧数据:\n");
s=list_input();
printf("输入新数据;\n");
s1=list_input();
list_updata_value(C,s,s1);
break;
case 8:
list_unique(C);
break;
case 9:
list_full(C);
C=NULL;
break;
default:
break;
}
printf("是否退出(是1|否0):");
scanf(" %d",&a);
if(a==1)
{
break;
}
}
return 0;
}
思维导图