搭建个场景:
将学生的信息,以顺序表的方式存储(堆区),并且实现封装函数 :
1】顺序表的创建
2】判满
3】判空
4】往顺序表里增加学生
5】遍历
6】任意位置插入学生
7】任意位置删除学生
8】修改
9】查找(按学生的学号查找)
10】去重
11】销毁顺序表
代码如下:
student_seqlist.h
#ifndef __STUDENT_SEQLIST_H__
#define __STUDENT_SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
typedef struct student
{
char name[128];
char gender[10];
int age;
int id;
}stu,*stu_p;
typedef struct seqlist
{
stu student[MAX];
int length;
}seq,*seq_p;
seq_p create_seq();
int empty_seqlist(seq_p Seq);
int full_seqlist(seq_p Seq);
void add_stu(seq_p Seq,char insert_name[],char insert_gender[],int insert_age,int insert_id);
void show_stu(seq_p Seq);
void insert_pos(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id);
void delete_pos(seq_p Seq,int pos);
void mod_stu(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id);
void find_stu(seq_p Seq,int find_id);
void rm_repeat(seq_p Seq);
void free_seq(seq_p *Seq);
#endif
student_seqlist.c
#include "student_seqlist.h"
//顺序表的创建
seq_p create_seq()
{
//从堆区申请空间创建顺序表
seq_p Seq=(seq_p)malloc(sizeof(seq));
if(NULL == Seq)
{
printf("创建学生顺序表失败!\n");
return NULL;
}
bzero(Seq->student,sizeof(Seq->student));//将顺序表中学生结构体数组清空
Seq->length=0;//将顺序表的长度置0
printf("顺序表创建成功!\n");
return Seq;
}
//判空
int empty_seqlist(seq_p Seq)
{
if(NULL == Seq)
{
printf("顺序表不合法!\n");
return -1;
}
return Seq->length==0?1:0;
}
//判满
int full_seqlist(seq_p Seq)
{
if(NULL == Seq)
{
printf("顺序表不合法!\n");
return -1;
}
return Seq->length==MAX?1:0;
}
//往顺序表里面添加学生(尾插)
void add_stu(seq_p Seq,char insert_name[],char insert_gender[],int insert_age,int insert_id)
{
if(NULL == Seq || full_seqlist(Seq))
{
printf("添加失败!\n");
return;
}
strcpy(Seq->student[Seq->length].name,insert_name);
strcpy(Seq->student[Seq->length].gender,insert_gender);
Seq->student[Seq->length].age=insert_age;
Seq->student[Seq->length].id=insert_id;
printf("学生信息添加成功!\n");
Seq->length++;
putchar(10);
}
//遍历显示输出学生信息
void show_stu(seq_p Seq)
{
if(NULL == Seq || empty_seqlist(Seq))
{
printf("输出显示学生信息失败!\n");
return;
}
printf("姓名\t性别\t年龄\t学号\n");
for(int i=0;i<Seq->length;i++)
{
printf("%s\t%s\t%d\t%d\n",Seq->student[i].name,Seq->student[i].gender,Seq->student[i].age,Seq->student[i].id);
}
putchar(10);
}
//任意位置插入学生
void insert_pos(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id)
{
if(NULL == Seq || full_seqlist(Seq) || pos <=0 || pos >MAX)
{
printf("插入学生信息失败!\n");
return;
}
for(int i=Seq->length-1;i>=pos-1;i--)
{
strcpy(Seq->student[i+1].name,Seq->student[i].name);
strcpy(Seq->student[i+1].gender,Seq->student[i].gender);
Seq->student[i+1].age=Seq->student[i].age;
Seq->student[i+1].id=Seq->student[i].id;
}
strcpy(Seq->student[pos-1].name,insert_name);
strcpy(Seq->student[pos-1].gender,insert_gender);
Seq->student[pos-1].age=insert_age;
Seq->student[pos-1].id=insert_id;
printf("学生信息插入成功!\n");
Seq->length++;
putchar(10);
}
//任意位置删除学生
void delete_pos(seq_p Seq,int pos)
{
if(NULL == Seq || empty_seqlist(Seq) || pos <=0 || pos >MAX)
{
printf("学生信息删除失败!\n");
return;
}
for(int i=pos-1;i<Seq->length-1;i++)
{
strcpy(Seq->student[i].name,Seq->student[i+1].name);
strcpy(Seq->student[i].gender,Seq->student[i+1].gender);
Seq->student[i].age=Seq->student[i+1].age;
Seq->student[i].id=Seq->student[i+1].id;
}
printf("学生信息删除成功!\n");
Seq->length--;
putchar(10);
}
//修改学生信息
void mod_stu(seq_p Seq,int pos,char insert_name[],char insert_gender[],int insert_age,int insert_id)
{
if(NULL == Seq || empty_seqlist(Seq) || pos <=0 ||pos >MAX)
{
printf("修改学生信息失败!\n");
return;
}
strcpy(Seq->student[pos-1].name,insert_name);
strcpy(Seq->student[pos-1].gender,insert_gender);
Seq->student[pos-1].age=insert_age;
Seq->student[pos-1].id=insert_id;
printf("学生信息修改成功!\n");
putchar(10);
}
//按学号查找学生信息
void find_stu(seq_p Seq,int find_id)
{
if(NULL == Seq || empty_seqlist(Seq))
{
printf("查找学生信息失败!\n");
return;
}
int flag=0;
for(int i=0;i<Seq->length;i++)
{
if(Seq->student[i].id == find_id)
{
flag=1;
printf("您要查找的学生信息如下:\n");
printf("%s\t%s\t%d\t%d\n",Seq->student[i].name,Seq->student[i].gender,Seq->student[i].age,Seq->student[i].id);
}
}
if(flag == 0)
{
printf("查无此学号的学生信息!\n");
}
putchar(10);
}
//学生信息去重
void rm_repeat(seq_p Seq)
{
if(NULL == Seq || empty_seqlist(Seq))
{
printf("学生信息去重失败!\n");
return;
}
for(int i=0;i<Seq->length;i++)
{
for(int j=i+1;j<Seq->length;j++)
{
if(Seq->student[i].id == Seq->student[j].id)
{
delete_pos(Seq,j+1);
j--;
}
}
}
}
//释放学生顺序表
void free_seq(seq_p *Seq)
{
if(NULL == *Seq)
{
printf("释放学生顺序表失败!\n");
return;
}
free(*Seq);
*Seq=NULL;//指针置空,防止野指针
}
main.c
#include "student_seqlist.h"
int main(int argc, const char *argv[])
{
stu_p student=(stu_p)malloc(sizeof(stu));
seq_p Seq=create_seq();
add_stu(Seq,"小明","男",20,1001);//插入学生信息
add_stu(Seq,"小华","男",22,1002);
add_stu(Seq,"小兰","女",21,1003);
show_stu(Seq);//输出显示学生信息
insert_pos(Seq,2,"小丽","女",23,1004);//任意位置插入学生信息
show_stu(Seq);
delete_pos(Seq,3);//删除任意位置学生信息
show_stu(Seq);
mod_stu(Seq,3,"小李","男",25,1005);//修改学生信息
show_stu(Seq);
find_stu(Seq,1005);//查找学生信息
insert_pos(Seq,2,"小李","男",25,1005);
show_stu(Seq);
rm_repeat(Seq);//学生信息去重
show_stu(Seq);
free_seq(&Seq);//释放学生顺序表
return 0;
}