顺序表创建、判空、判满、增删改查
头文件
#ifndef __STUDENT_H__
#define __STUDENT_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
typedef struct student
{
char name[20];
int id;
double score;
}stu,*stuPtr;
typedef stu DataType;
typedef struct sequence
{
DataType data[MAX];
int len;
}seq,*seqPtr;
//在堆区创建顺序表
seqPtr stu_create();
//判满
int fill(seqPtr S);
//判空
int empty(seqPtr S);
//往顺序表里增加学生
int add(seqPtr S);
//遍历
void show(seqPtr S);
//任意位置插入学生信息
int insert(seqPtr S,int index,DataType T);
//在顺序表任意位置删除数据
int delete_index(seqPtr S,int index);
//在顺序表任意位置修改数据
int change_index(seqPtr S,int index);
//查找 (按学生的学号查找)
void find_id(seqPtr S,int id);
//去重
int repeat(seqPtr S);
//顺序表销毁
void free_seq(seqPtr S);
#endif
源文件
#include "student.h"
seqPtr stu_create()
{
//创建顺序表
seqPtr S=(seqPtr)malloc(sizeof(seq));
//判断是否创建成功
if(NULL!=S)
{
printf("创建成功\n");
S->len=0;
bzero(S->data,sizeof(S->data));
return S;
}
printf("创建失败\n");
return NULL;
}
//判满
int fill(seqPtr S)
{
//判断顺序表是否合法
if(NULL==S)
{
printf("判满失败\n");
return 0;
}
return S->len==MAX;
}
//判空
int empty(seqPtr S)
{
//判断顺序表是否合法
if(NULL==S)
{
printf("判空失败\n");
return 0;
}
return S->len==0;
}
//往顺序表里增加学生
int add(seqPtr S)
{
//判断顺序表是否合法、判满
if(NULL==S || fill(S))
{
printf("增加失败\n");
return 0;
}
//增加学生信息
DataType T;
printf("please enter name & id & score:");
scanf("%s %d %lf",T.name,&T.id,&T.score);
//放入顺序表里
strcpy(S->data[S->len].name,T.name);
S->data[S->len].id=T.id;
S->data[S->len].score=T.score;
S->len++;
return 1;
}
//遍历
void show(seqPtr S)
{
printf("name\tid\tscore\n");
for(int i=0;i<S->len;i++)
{
printf("%s\t%d\t%.2lf\n",S->data[i].name, \
S->data[i].id, S->data[i].score);
}
printf("\n");
}
//任意位置插入学生信息
int insert_index(seqPtr S,int index)
{
//判断接收的顺序表是否合法、判满、插入的位置是否合法
if(NULL==S || fill(S) || index<1 || index>S->len)
{
printf("插入失败\n");
return 0;
}
//增加学生信息
DataType T;
printf("please enter name & id & score:");
scanf("%s %d %lf",T.name,&T.id,&T.score);
int i;
for(i=S->len;i>=index;i--)
{
S->data[i]=S->data[i-1];
}
strcpy(S->data[index-1].name,T.name);
S->data[index-1].id=T.id;
S->data[index-1].score=T.score;
S->len++;
return 1;
}
int delete_index(seqPtr S,int index)
{
//判断接收的顺序表是否合法、判空、插入的位置是否合法
if(NULL==S || empty(S) || index<1 || index>S->len)
{
printf("删除失败\n");
return 0;
}
//删除数据
for(int i=index;i<S->len;i++)
S->data[i-1]=S->data[i];
//顺序表长度自减
S->len--;
return 1;
}
int change_index(seqPtr S,int index)
{
//1.判断接收的顺序表是否合法
//2.判断要修改的位置是否合理
//3.判空
if(NULL==S || index<1 || index>S->len || empty(S))
{
printf("修改失败\n");
return 0;
}
//修改学生信息
DataType T;
printf("please enter name & id & score:");
scanf("%s %d %lf",T.name,&T.id,&T.score);
if(strcmp(S->data[index-1].name,T.name)==0)
printf("无需修改姓名\n");
else
strcpy(S->data[index-1].name,T.name);
if(S->data[index-1].id==T.id)
printf("无需修改学号\n");
else
S->data[index-1].id=T.id;
if(S->data[index-1].score==T.score)
printf("无需修改分数\n");
else
S->data[index-1].score=T.score;
return 1;
}
void find_id(seqPtr S,int id)
{
//判断接收的顺序表是否合法、判空
if(NULL==S || empty(S))
{
printf("查找失败\n");
return;
}
//查找数据
int flag=0;
for(int i=0;i<S->len;i++)
{
if(id==S->data[i].id)
{
flag=1;
printf("name\tid\tscore\n");
printf("%s\t%d\t%.2lf\n",S->data[i].name, \
S->data[i].id, S->data[i].score);
return;
}
}
if(flag==0)
printf("没有这个数据\n");
return;
}
//去重
int repeat(seqPtr S)
{
//判断接收的顺序表是否合法
if(NULL==S || empty(S))
printf("去重失败\n");
for(int i=0;i<S->len;i++)
{
for(int j=i+1;j<S->len;j++)
{
if(S->data[j].id==S->data[i].id)
{
//删除数据
delete_index(S,j+1);//参数位置是下标+1
j--;//防止漏删
}
}
}
}
void free_seq(seqPtr S)
{
//判断接收的顺序表是否合法
if(NULL==S)
{
printf("销毁失败\n");
return;
}
free(S);
S=NULL;
}
测试文件
#include "student.h"
int main(int argc, const char *argv[])
{
seqPtr S=stu_create();
add(S);
add(S);
show(S);
insert_index(S,2);
show(S);
delete_index(S,2);
show(S);
change_index(S,2);
show(S);
find_id(S,2);
repeat(S);
show(S);
free_seq(S);
S=NULL;
return 0;
}