数据结构顺序表

/**************stu.h****************/

#ifndef __STU_H__
#define __STU__H__
 
#define MAX 40
 
 
typedef struct
{
    char name[32];
    char sex;
    double score;
}Stu;                     //定义学生结构体
 
typedef struct{
    Stu student[MAX];   //定义学生结构体数组
    int len;
}seqlist,*seqlistPtr;
 
//创建表并初始化
seqlistPtr list_create();
 
//判满
int list_full(seqlistPtr S);
 
//判空
int list_empty(seqlistPtr S);
 
//向表中添加数据
int list_add(seqlistPtr S,Stu e);
 
//遍历
void list_show(seqlistPtr S);
 
//任意位置插入数据
int list_insert_pos(seqlistPtr S,int pos,Stu e);
 
//任意位置删除数据
int list_delete_pos(seqlistPtr S,int pos);
 
//排序
void list_sort(seqlistPtr S,int flag);
 
//按位置修改
int list_update_pos(seqlistPtr S,int pos,Stu e);
 
//按分数修改
int list_update_value(seqlistPtr S,double old_e,double new_e);
 
//查找指定位置元素
int list_search_pos(seqlistPtr S,int pos);
 
//求分数最值
int list_mvalue(seqlistPtr S,int flag);
 
//释放表
void list_free(seqlistPtr S);
 
#endif

 /**************************stu.c************************/

#include "stu.h"
#include
#include
#include
 
//创建表
seqlistPtr list_create(){
    seqlistPtr S = (seqlistPtr)malloc(sizeof(seqlist));
    if(NULL == S){
        printf("创建失败\n");
        return NULL;
    }
 
    //初始化表
    S->len = 0;
    printf("创建成功\n");
    return S;
}
 
 
//判满
int list_full(seqlistPtr S){
    if(NULL == S){
        printf("操作不合法\n");
        return 0;
    }
    return S->len == MAX;
}
 
 
//判空
int list_empty(seqlistPtr S){
    if(NULL == S){
        printf("操作不合法\n");
        return 0;
    }
    return S->len == 0;
}
  
//添加学生数据
int list_add(seqlistPtr S,Stu e){
    if(NULL == S || list_full(S)){
        printf("无法添加\n");
        return 0;
    }
    S->student[S->len++] = e;
    return 1;
}
 
//遍历
void list_show(seqlistPtr S){
    if(NULL == S){
        printf("遍历\n");
    }
    printf("姓名\t性别\t成绩\n");
    for(int i = 0;i < S->len;i++){
        printf("%s\t%c\t%.2lf\n",S->student[i].name,S->student[i].sex,S->student[i].score);
    }
}
 
 
//任意位置插入数据
int list_insert_pos(seqlistPtr S,int pos,Stu e){
    if(NULL == S || list_full(S) || pos < 0 || pos > S->len){
        printf("插入失败\n");
        return 0;
    }    
    for(int i=S->len-1;i>=pos;i--){
        S->student[i+1] = S->student[i];
    }
    S->student[pos] = e;
    S->len++;
    printf("插入成功\n");
    return 1;
}
 
 
//任意位置删除数据
int list_delete_pos(seqlistPtr S,int pos){
    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->student[i] = S->student[i+1];//元素前移
    }
    S->len--; //表长减一
    printf("删除成功\n");
    return 1;
}
//成绩排序
void list_sort(seqlistPtr S,int flag){
    if(NULL == S || list_empty(S)){
        printf("排序失败\n");
    }
    Stu temp;
    if(flag==0)
    {
        for(int i = 0;i < S->len-1;i++)
        {
            for(int j = 0;j < S->len-1-i;j++)
            {
                if(S->student[j].score > S->student[j+1].score)
                {
                    temp = S->student[j];
                    S->student[j] = S->student[j+1];
                    S->student[j+1] = temp;
                }
            }
        }
    }
    if(flag==1)
        for(int i = 0;i < S->len-1;i++)
        {
            for(int j = 0;j < S->len-1-i;j++)
            {
                if(S->student[j].score < S->student[j+1].score)
                {
                    temp = S->student[j];
                    S->student[j] = S->student[j+1];
                    S->student[j+1] = temp;
                }
            }
        }
    }
 
//按位置进行修改
int list_update_pos(seqlistPtr S,int pos,Stu e){
    if(NULL == S || list_empty(S) || pos < 0 || pos > S->len){
        printf("无法修改\n");
        return 0;
    }
    S->student[pos] = e;
    printf("修改成功\n");
    return 1;
}
 
//按分数进行修改
int list_update_value(seqlistPtr S,double old_e,double new_e){
    if(NULL == S || list_empty(S) || old_e == new_e){
        printf("无法修改\n");
        return 0;
    }
    for(int i = 0;i < S->len;i++)
    {
        if(S->student[i].score == old_e)
        {
            S->student[i].score = new_e;
        }
    }
    printf("修改成功\n");
    return 1;
}
  
//查找指定位置元素
int list_search_pos(seqlistPtr S,int pos){
    if(NULL == S || list_empty(S) || pos < 0 || pos > S->len){
        printf("查找失败\n");
        return 0;
    }
    printf("查找成功\n");
    printf("%s\t%c\t%.2lf\n",S->student[pos].name,S->student[pos].sex,S->student[pos].score);
    return 1;
}
 
//分数求最值
int list_mvalue(seqlistPtr S,int flag){
    if(NULL == S || list_empty(S)){
        printf("操作失败\n");
        return 0;
    }
    double max_score = S->student[0].score;
    double min_score = S->student[0].score;
    if(flag==1){
        for(int i = 0;i < S->len;i++){
            if(S->student[i].score > max_score){
                max_score = S->student[i].score;
            }
        }
        printf("最高分为%.2lf",max_score);
    }
    if(flag==0){
        for(int i = 0;i < S->len;i++){
            if(S->student[i].score < min_score){
                min_score = S->student[i].score;
            }
        }
        printf("最低分为%.2lf",min_score);
    }
}
 
//释放表
void list_free(seqlistPtr S){
    if(NULL != S){
        free(S);
        S = NULL;
    }
    printf("释放成功\n");
}

 /************************main.c*****************************/

#include "stu.h"
#include

int main(int argc, const char *argv[])
{
    seqlistPtr S = list_create();    
    
    Stu s1 = {"张三",'M',88};
    Stu s2 = {"李四",'W',99};
    Stu s3 = {"王五",'M',77};
    list_add(S,s1);
    list_add(S,s2);
    list_add(S,s3);
    list_show(S);
 
    int flag,flag_sort,flag_mvalue;
    int pos_add,pos_delete,pos_update,pos_search;
    double old_e,new_e;
    Stu e4;
    putchar(10);
    printf("指令:\n*****任意位置添加学生信息*****1\n*****任意位置删除学生信息*****2\n*****打印学生信息表***********3\n*****学生成绩排序*************4\n*****按位置修改学生信息*******5\n*****按分数修改学生信息*******6\n*****查找指定位置学生信息*****7\n*****生成绩最值***************8\n*****释放表*******************9\n");
    printf("输入指令:");
    scanf("%d",&flag);
    switch (flag){
    case 1:
        printf("请输入添加的位置:");
        scanf(" %d",&pos_add);
        printf("请输入学生的姓名:");
        scanf(" %s",e4.name);
        printf("请输入学生的性别:");
        scanf(" %c",&e4.sex);
        printf("请输入学生的成绩:");
        scanf(" %lf",&e4.score);
        list_insert_pos(S,pos_add,e4);
        break;
    case 2:
        printf("请输入删除的位置:");
        scanf(" %d",&pos_delete);
        list_delete_pos(S,pos_delete);
        break;
    case 3:
        list_show(S);
        break;
    case 4:
        printf("升序**0,降序**1:");
        scanf(" %d",&flag_sort);
        list_sort(S,flag_sort);
        list_show(S);
        break;
    case 5:
        printf("请输入要修改的位置:");
        scanf(" %d",&pos_update);
        Stu e5;
        printf("请输入学生的姓名:");
        scanf(" %s",e5.name);
        printf("请输入学生的性别:");
        scanf(" %c",&e5.sex);
        printf("请输入学生的成绩:");
        scanf(" %lf",&e5.score);
        list_update_pos(S,pos_update,e5);
        break;
    case 6:
        printf("请输入要修改的分数:");
        scanf(" %lf",&old_e);
        printf("请输入新的分数:");
        scanf(" %lf",&new_e);
        list_update_value(S,old_e,new_e);
        break;
    case 7:
        printf("请输入要查找的位置:");
        scanf(" %d",&pos_search);
        list_search_pos(S,pos_search);
        break;
    case 8:
        printf("最高分**1,最低分**0:");
        scanf(" %d",&flag_mvalue);
        list_mvalue(S,flag_mvalue);
        break;
    case 9:
        list_free(S);
        S = NULL;
        printf("表已经释放\n");
        break;
    default:
        printf("指令错误\n");
    }
    return 0;
}

 数据结构顺序表_第1张图片

 

你可能感兴趣的:(数据结构)