功能函数:
#include"sxb.h"
seqListPtr list_create()//创建顺序表
{
seqListPtr S=(seqListPtr)malloc(sizeof(seqList));
if(NULL==S)
{
printf("顺序表创建失败\n");
return NULL;
}
memset(S->data,0,sizeof(S->data));
S->len=0;
printf("顺序表创建成功\n");
return S;
}
int list_empty(seqListPtr S)//判空
{
if(NULL==S)
{
printf("所给顺序表不合法\n");
return 0;
}
return S->len==0;
}
int list_full(seqListPtr S)//判满
{
if(NULL==S)
{
printf("所给顺序表不合法\n");
return 0;
}
return S->len==MAX;
}
int pos_place(seqListPtr S)//指定位置函数
{
if(NULL==S)
{
printf("所给顺序表不合法\n");
return 0;
}
int i;
printf("请输入位置:");
scanf("%d",&i);
return i-1;
}
int list_add(seqListPtr S)//向顺序表中添加元素
{
if(NULL==S||list_full(S))
{
printf("添加失败\n");
return 0;
}
printf("请输入添人数:");
int a;
scanf("%d",&a);
S->len=a;
int i=0;
char n[10];
char x[4];
char na[10];
double s;
datatype g;
while(1)
{
printf("请输入第%d位学生信息(姓名 性别 名族 成绩 年级):\n",i+1);
scanf("%s%s%s%lf%d",n,x,na,&s,&g);
strcpy(S->data[i].name,n);
strcpy(S->data[i].sex,x);
strcpy(S->data[i].nation,na);
S->data[i].scor=s;
S->data[i].grade=g;
i++;
printf("添加成功\n");
if(i==a)
break;
}
return 1;
}
void list_show(seqListPtr S)//遍历顺序表
{
if(NULL==S||list_empty(S))
{
printf("遍历失败\n");
return;
}
printf("姓名\t性别\t名族\t成绩\t年级\n");
for(int i=0;i<S->len;i++)
{
printf("%s\t%s\t%s\t%.2lf\t%d\n",S->data[i].name,S->data[i].sex,S->data[i].nation,S->data[i].scor,S->data[i].grade);
}
}
int list_insert(seqListPtr S)//任意位置插入元素
{
int pos=pos_place(S);
if(NULL==S||list_full(S)||pos<0||pos>S->len)
{
printf("插入失败\n");
return 0;
}
for(int i=S->len;i>pos;i--)
{
S->data[i]=S->data[i-1];
}
char n[10];
char x[4];
char na[10];
double s;
datatype g;
printf("请输入这位学生信息(姓名 性别 名族 成绩 年级):\n");
scanf("%s%s%s%lf%d",n,x,na,&s,&g);
strcpy(S->data[pos].name,n);
strcpy(S->data[pos].sex,x);
strcpy(S->data[pos].nation,na);
S->data[pos].scor=s;
S->data[pos].grade=g;
S->len++;
printf("插入成功\n");
return 1;
}
int list_delete(seqListPtr S)//任意位置删除元素
{
int pos=pos_place(S);
if(NULL==S||list_empty(S)||pos<0||pos>=S->len)
{
printf("删除失败\n");
return 0;
}
for(int i=pos;i<S->len-1;i++)
{
S->data[i]=S->data[i+1];
}
S->len--;
printf("删除成功\n");
return 1;
}
stuptr list_search_pos(seqListPtr S)//查找指定位置的元素,返回地址
{
int pos=pos_place(S);
if(NULL==S||list_empty(S)||pos<0||pos>=S->len)
{
printf("查找失败\n");
return NULL;
}
else
return &S->data[pos];
}
int list_updata(seqListPtr S)//按位置进行修改
{
int pos=pos_place(S);
if(NULL==S||list_empty(S)||pos<0||pos>=S->len)
{
printf("修改失败\n");
return 0;
}
printf("请输入修改后学生信息:");
char n[10];
char x[4];
char na[10];
double s;
datatype g;
scanf("%s%s%s%lf%d",n,x,na,&s,&g);
strcpy(S->data[pos].name,n);
strcpy(S->data[pos].sex,x);
strcpy(S->data[pos].nation,na);
S->data[pos].scor=s;
S->data[pos].grade=g;
printf("修改成功\n");
return 1;
}
int sz()//选择
{
printf("请选择元素(姓名0) (性别1) (名族2) (成绩3) (年级4):");
int i=0,j=0;
scanf("%d",&i);
return i;
}
int list_search_value(seqListPtr S)//按值进行查找元素位置
{
if(NULL==S||list_empty(S))
{
printf("查找失败\n");
return 0;
}
int i=sz(),j;
if(i==0){
printf("请输入:");
char n[10];
scanf("%s",n);
for(j=0;j<S->len;j++){
if(strcmp(S->data[j].name,n)==0)
return j;
printf("无该学生\n");
}
}
if(i==1){
printf("请输入:");
char x[4];
scanf("%s",x);
for(j=0;j<S->len;j++){
if(strcmp(S->data[j].sex,x)==0)
return j;
printf("无该学生\n");
}
}
if(i==2){
printf("请输入:");
char na[10];
scanf("%s",na);
for(j=0;j<S->len;j++){
if(strcmp(S->data[j].nation,na)==0)
return j;
printf("无该学生\n");
}
}
if(i==3){
printf("请输入:");
double s;
scanf("%lf",&s);
for(j=0;j<S->len;j++){
if(s==S->data[j].scor)
return j;
printf("无该学生\n");
}
}
if(i==4){
printf("请输入:");
datatype g;
scanf("%d",&g);
for(j=0;j<S->len;j++){
if(g==S->data[j].grade)
return j;
printf("无该学生\n");
}
}
return -1;
}
void list_updata_value(seqListPtr S)//按值进行修改
{
if(NULL==S||list_empty(S))
{
printf("修改失败\n");
return ;
}
int i=sz(),j;
if(i==0){
printf("请输入原值:");
char n[10];
scanf("%s",n);
char n1[10];
printf("请输入改值:");
scanf("%s",n1);
for(j=0;j<S->len;j++){
if(strcmp(S->data[j].name,n)==0)
strcpy(S->data[j].name,n1);
}
printf("修改成功\n");
}
if(i==1){
printf("请输入原值:");
char x[10];
scanf("%s",x);
char x1[10];
printf("请输入改值:");
scanf("%s",x1);
for(j=0;j<S->len;j++){
if(strcmp(S->data[j].sex,x)==0)
strcpy(S->data[j].sex,x1);
}
printf("修改成功\n");
}
if(i==2){
printf("请输入原值:");
char na[10];
scanf("%s",na);
char na1[10];
printf("请输入改值:");
scanf("%s",na1);
for(j=0;j<S->len;j++){
if(strcmp(S->data[j].nation,na)==0)
strcpy(S->data[j].nation,na1);
}
printf("修改成功\n");
}
if(i==3){
printf("请输入原值:");
double s;
scanf("%lf",&s);
double s1;
printf("请输入改值:");
scanf("%lf",&s1);
for(j=0;j<S->len;j++){
if(S->data[j].scor==s)
S->data[j].scor=s1;
}
printf("修改成功\n");
}
if(i==4){
printf("请输入原值:");
datatype g;
scanf("%d",&g);
datatype g1;
printf("请输入改值:");
scanf("%d",&g1);
for(j=0;j<S->len;j++){
if(S->data[j].grade==g)
S->data[j].grade=g1;
}
printf("修改成功\n");
}
}
void list_sort(seqListPtr S,int flag)//将顺序表排序,选择排序0将1升
{
if(NULL==S||list_empty(S))
{
printf("排序失败\n");
return;
}
int i=0,j=0,k=0,t=0;
if(0==flag)
{
for(i=1;i<S->len;i++)
{
k=i-1;
for(j=i-1;j<S->len;j++)
{
if(S->data[k].scor<S->data[j].scor)
{
k=j;
}
}
if(k!=i-1)
{
t=S->data[k].scor;
S->data[k].scor=S->data[i-1].scor;
S->data[i-1].scor=t;
}
}
printf("降序完成\n");
}
if(1==flag)
{
for(i=1;i<S->len;i++)
{
k=i-1;
for(j=i-1;j<S->len;j++)
{
if(S->data[k].scor>S->data[j].scor)
{
k=j;
}
}
if(k!=i-1)
{
t=S->data[k].scor;
S->data[k].scor=S->data[i-1].scor;
S->data[i-1].scor=t;
}
}
printf("升序完成\n");
}
}
void list_unique(seqListPtr S)//顺序表去重
{
if(NULL==S|S->len<=1)
{
printf("排序失败\n");
return;
}
for(int i=0;i<S->len;i++)
{
for(int j=i+1;j<S->len;j++)
{
if(strcmp(S->data[i].name,S->data[j].name)==0)
{
for(int k=j;k<S->len-1;k++)
{
S->data[k]=S->data[k+1];
}
S->len--;
j--;
}
}
}
printf("去重成功\n");
}
void list_free(seqListPtr *S)//释放顺序表
{
if(NULL != *S)
{
free(*S);
*S=NULL;
}
printf("释放顺序表成功\n");
}
void list_select(seqListPtr S)//选择函数
{
while(1)
{
int i;
printf("请选择删除(0) 添加(1) 插入(2) 修改(3) 查找(4) 排序(5) 去重(6) 退出(7):");
scanf("%d",&i);
if(0==i)
{
list_delete(S);
list_show(S);
}
if(1==i)
{
list_add(S);
list_show(S);
}
if(2==i)
{
list_insert(S);
list_show(S);
}
if(3==i)
{
while(1)
{
int j=0;
printf("请输入位置修改学生信息(0) 请输入学生信息某元素整体修改(1) 结束修改(2): ");
scanf("%d",&j);
if(0==j)
{
list_updata(S);
list_show(S);
}
if(1==j)
{
list_updata_value(S);
list_show(S);
}
if(2==j)
break;
}
}
if(4==i)
{
while(1)
{
int j=0;
printf("选择输入第几行查看学生信息(0) 选择输入一个信息查看(1) 结束查看(2): ");
scanf("%d",&j);
if(1==j)
{
int i;
while(i=list_search_pos(S)>0){
printf("该学生所有信息为:%s\t%s\t%s\t%.2lf\t%d\n",S->data[i].name,S->data[i].sex,S->data[i].nation,S->data[i].scor,S->data[i].grade);
}
}
if(0==j)
{
stu *p=list_search_pos(S);
printf("该学生所有信息为:%s\t%s\t%s\t%.2lf\t%d\n",p->name,p->sex,p->nation,p->scor,p->grade);
if(NULL==p){
printf("无该信息");
break;
}
}
if(2==j)
break;
}
}
if(5==i){
printf("请选择升序(1)降序(0)");
int a;
scanf("%d",&a);
list_sort(S,a);
list_show(S);
}
if(6==i){
list_unique(S);
list_show(S);
}
if(7==i)
{
return;
}
printf("是否还有操作:有(1) 无(0):");
int j;
scanf("%d",&j);
if(j==0)
return;
}
}
主函数:
#include "sxb.h"
int main(int argc, const char *argv[])
{
seqListPtr S=list_create();
if(NULL==S)
{
return -1;
}
list_select(S);
list_free(&S);
list_show(S);
return 0;
}
头文件:
#ifndef _sxb_h_
#define _sxb_h_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 40
typedef int datatype;
typedef struct
{
char name[10];//姓名
char sex[4];//性别
char nation[10];//民族
double scor;//成绩
datatype grade;//年级
}stu,*stuptr;
typedef struct//定义顺序表
{
stu data[MAX];//班级
int len;//人数
}seqList,*seqListPtr;
void list_select(seqListPtr S);//选择函数
int pos_place(seqListPtr S);//指定位置函数
seqListPtr list_create();//创建顺序表
int list_empty(seqListPtr S);//判空
int list_full(seqListPtr S);//判满
int list_add(seqListPtr S);//向顺序表中添加元素
void list_show(seqListPtr S);//遍历顺序表
int list_insert(seqListPtr S);//任意位置插入元素
int list_delete(seqListPtr S);//任意位置删除元素
stuptr list_search_pos(seqListPtr S);//查找指定位置的元素,返回地址
int sz();//选择
int list_search_value(seqListPtr S);//按值进行查找元素位置
int list_updata(seqListPtr S);//按位置进行修改
void list_updata_value(seqListPtr S);//按值进行修改
void list_sort(seqListPtr S,int flag);//将顺序表排序,选择排序0将1升
void list_unique(seqListPtr S);//顺序表去重
void list_free(seqListPtr *S);//释放顺序表
#endif
思维导图: