C语言数据结构一:线性表之顺序表的实现

seqlish.h:头文件

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#define SEQLIST_INIT_SIZE 8
#define INC 3
typedef int ElemType;

typedef struct SeqList{
    ElemType *base;
    int capacity;
    int size;
}SeqList;

void InitSeqList(SeqList *list);
void push_back(SeqList *list,ElemType x);
void push_front(SeqList *list,ElemType x);
void show_list(SeqList *list);
void pop_back(SeqList *list);
void pop_front(SeqList *list);
void insert_pos(SeqList *list,int pos,ElemType x);
int find(SeqList *list,ElemType x);
int length(SeqList *list);
void delete_pos(SeqList *list,int pos);
void delete_val(SeqList *list,ElemType val);
void clean(SeqList *list);
void destory(SeqList *list);
void sortMP(SeqList *list);
void resver(SeqList *list);
int inc(SeqList *list);

 

seqlist.c:顺序表具体实现

#include "seqlist.h"

int inc(SeqList *list){
    ElemType *newbase = (ElemType *)realloc(list->base,sizeof(ElemType)*(SEQLIST_INIT_SIZE+INC));
    if(newbase == NULL){
        printf("分配内存空间失败,内存不足\n");
        return 0;
    }
    list->base = newbase;
    list->capacity += INC;
    return 1;
}

void InitSeqList(SeqList *list){
    //开辟空间
    list->base = (ElemType *)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
    assert(list->base!=NULL);
    //大小初始化
    list->capacity = SEQLIST_INIT_SIZE;
    list->size = 0;
}

void push_back(SeqList *list,ElemType x){
    //判满
    if(list->size >= list->capacity && !inc(list)){
        printf("顺序表空间已经满了\n");
        return;
    }
    //插入数据
    list->base[list->size]=x;
    //长度增加
    list->size++;
}

void push_front(SeqList *list,ElemType x){
    //if 满
    if(list->size >=list->capacity && !inc(list)){
        printf("顺序表空间已经满了\n");
        return;
    }
    //移动后面的元素
    for(int i=list->size;i>0;--i){
        list->base[i]=list->base[i-1];
    }
    //首位插入数据
    list->base[0]=x;
    list->size++;
}

void show_list(SeqList *list){
    for(int i=0;i<list->size;++i){
        printf("%d ",list->base[i]);
    }
    printf("\n"); 
}

void pop_back(SeqList *list){
    //判空
    if(list->size == 0){
        printf("当前为空\n");
        return;
    }
    
    printf("取出最后一个元素为:%d\n",list->base[list->size-1]);
    list->size--;
}

void pop_front(SeqList *list){ 
    //判空
    if(list->size == 0){
        printf("当前为空\n");
        return;
    }
    
    printf("取出第一个元素为:%d\n",list->base[0]);
    //移动元素
    for(int i=list->size-1;i>0;i--){
        list->base[i-1]=list->base[i];
    }

    list->size--;
}
void insert_pos(SeqList *list,int pos,ElemType x){
    //判断插入位置合法性
    if(pos>list->size||pos<0){
        printf("输入不合法\n");
    }
    if(list->size >=list->capacity && !inc(list)){
        printf("顺序表空间已经满了\n");
        return;
    }
    if(pos == 0){
        push_front(list,x);
    }else if(pos == list->size){
        push_back(list,x);
    }else{
        for(int i=list->size;i>pos;i--){
            list->base[i]=list->base[i-1];
        }
        list->base[pos]=x;
        list->size++;
    }
    
}
int find(SeqList *list,ElemType x){
    for(int i=0;i<list->size;i++){
        if(list->base[i]==x){
            printf("当前查找数在顺序表的的下标为%d,在第%d位\n",i,i+1);
            return i;
        }   
    }
    
    printf("查找结束,未找到对应的数据\n");
    return -1;
}
int length(SeqList *list){
    return list->size;
}
void delete_pos(SeqList *list,int pos){
    if(pos>list->size||pos<0){
        printf("输入不合法\n");
    }
    for(int i=pos;i<list->size-1;i++){
        list->base[i]=list->base[i+1];
    }
    list->size--;
}
void delete_val(SeqList *list,ElemType x){
    int pos = find(list,x);
    if(pos != -1){
        delete_pos(list,pos);
    }
}
void clean(SeqList *list){
    list->size = 0;
}
void destory(SeqList *list){
    free(list->base);
    list->base = NULL;
    list->capacity = 0;
    list->size = 0;
}

void sortMP(SeqList *list){
    //冒泡排序思想:
    //多次遍历,两两比对,大后小前
    //这个是比较的躺数,一共n个数,比较n-1躺 。
    for(int i =0;i<list->size-1;i++){
        //每一趟的比较次数,随着躺数增加,大的到了后面,比较次数减少,后面的不比
        //一次比较,少比1次,n次比较,少比n次
        for(int j = 0;j<list->size-i-1;j++){
            if(list->base[j]>list->base[j+1]){
                ElemType temp = list->base[j];
                list->base[j]=list->base[j+1];
                list->base[j+1]=temp;
            }
        }  
    }
}
void resver(SeqList *list){
    if(list->size==0||list->size ==1) return;
    int low = 0;
    int high = list->size-1;
    while(low<high){
        ElemType temp = list->base[low];
        list->base[low] = list->base[high];
        list->base[high] = temp;
        low++;
        high--;
    }
}

 

main.c :主函数

#include "seqlist.h"

int main(){
    SeqList mylist;
    InitSeqList(&mylist);
    ElemType x;
    int pos;
    int select = 1;
    while(select){
        printf("*********************************\n");
        printf("请输入您需要的顺序表操作\n");
        printf("*   1.尾部插入     2.头部插入\n");
        printf("*   3.顺序表展示   4.尾部取一个\n");
        printf("*   5.头部取一个   6.插入在指定位置\n");
        printf("*   7.查找         8.长度\n");
        printf("*   9.按位删除     10.按值删除\n");
        printf("*   11.排序        12.反置\n");
        printf("*   13.清空        14.销毁\n");
        printf("    0.退出\n");
        printf("*********************************\n");
        printf("请选择:\n");    
        scanf("%d",&select);
        if(select == 0) break;
        
        switch(select){
            case 1:
                printf("请输入您的数据(输入-1结束)\n");
                //逗号表达式,输出以最后为准
                while(scanf("%d",&x),x != -1){
                    push_back(&mylist,x);
                }
                break;
            case 2:
                printf("请输入您的数据,系统会按顺序做头部插入(输入-1结束)\n");
                while(scanf("%d",&x),x != -1){
                    push_front(&mylist,x);
                }
                break;
            case 3:
                show_list(&mylist); 
                break;
            case 4:
                pop_back(&mylist);
                break;
            case 5:
                pop_front(&mylist);
                break;
            case 6:
                printf("请输入插入的数据\n");
                scanf("%d",&x);
                printf("请输入插入的位置\n");
                scanf("%d",&pos);
                insert_pos(&mylist,pos,x);
                break;
            case 7:
                printf("请输入查找的数据\n");
                scanf("%d",&x);

                find(&mylist,x);
                break;
            case 8:
                printf("当前顺序表长度为%d\n",length(&mylist));
                break;
            case 9:
                printf("请输入删除的顺序表下标\n");

                scanf("%d",&pos);

                delete_pos(&mylist,pos);
                show_list(&mylist); 
                break;
            case 10:
                printf("请输入删除的顺序表元素\n");

                scanf("%d",&x);
                
                delete_val(&mylist,x);
                show_list(&mylist); 
                break;
            case 11:
                sortMP(&mylist);
                show_list(&mylist);
                break;
            case 12:
                resver(&mylist);
                show_list(&mylist);
                break;
            case 13:
                clean(&mylist);
                break;
            case 14:
                destory(&mylist);
                select = 0;
                break;
            default:
                printf("输入错误\n");
                break;
        }
    }
    destory(&mylist);
}

makefile

main.out:seqlist.o main.c
	gcc seqlist.o main.c
seqlist.o:seqlist.c
	gcc -c seqlist.c

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值