欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言实现顺序表各个功能操作函数

程序员文章站 2024-03-20 14:13:10
...

c语言实现顺序表的操作函数

首先,一个顺序表先要用结构体定义
typedef struct Seqlist{
Datatype array[MAX_SIZE];
size_t Size;
}Seqlist,*psl;

然后要被初始化,这里用memset来初始化

    memset(psl->array, 0, MAX_SIZE*sizeof(Datatype));
    psl->Size = 0;

这里实现一个静态表,
然后就可以扩展它的功能了。
这里用代码大概写一些,把他们接口函数写在Seqlist.h头文件中:

#ifndef SEQ_LIST
#define SEQ_LIST
#define _CRT_SECURE_NO_WARININGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

typedef int Datatype;
#define MAX_SIZE  100

typedef struct Seqlist{
    Datatype array[MAX_SIZE];
    size_t Size;
}Seqlist,*psl;

void InitSeqlist(Seqlist* seqlist);// 初始化 
void Pushback(Seqlist* seqlist, Datatype data);// 尾部插入
void Pushfront(Seqlist* psl, Datatype data);// 头部插入 
void Popback(Seqlist* psl);// 尾部删除 
void Popfront(Seqlist* psl);// 头部删除 
void Insert(Seqlist* psl, size_t pos, Datatype data);// 按下标插入,pos 的范围是 [0, size] 
void Erase(Seqlist* psl, size_t pos);// 按下标删除,pos 的范围是 [0, size) 
void Remove(Seqlist* psl, Datatype data);// 按值删除,只删遇到的第一个 
void Removeall(Seqlist* psl, Datatype data);// 按值删除,删除所有的 
void Clear(Seqlist* psl);// 清空 
void show(Seqlist* psl);//打印顺序表
int Find(Seqlist* psl, Datatype data);// 按值查找,返回第一个找到的下标,如果没找到,返回 -1 
int Empty(Seqlist* psl);// 判断是否为空,1 表示空, 0 表示不空
void Selectsort(Seqlist* psl);//选择排序
void bubblesort(Seqlist* psl);//冒泡排序
int Size(Seqlist* psl);// 返回数量 
void Destroy(Seqlist* psl);// 销毁 

如果还有想法,可以附加在这些接口函数里面。

下面就是这些功能代码分步实现了,全部写在一个.c文件里

#define _CRT_SECURE_NO_WARININGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "SeqList.h"

//初始化顺序表
void InitSeqlist(Seqlist* psl){
    memset(psl->array, 0, MAX_SIZE*sizeof(Datatype));
    psl->Size = 0;
}

//尾插
void Pushback(Seqlist* seqlist, Datatype data){
    assert(seqlist);
    if (seqlist->Size > MAX_SIZE){
        printf("full");
        return;
    }
    seqlist->array[seqlist->Size] = data;
    seqlist->Size++;
}

//头插
void Pushfront(Seqlist* psl, Datatype data){
    int begin = 0;
    assert(psl);
    if (psl->Size == MAX_SIZE){
        printf("full");
        return;
    }
    else{
        for (begin = psl->Size; begin >= 0; begin--){
            psl->array[begin + 1] = psl->array[begin];
        }
        psl->array[0] = data;
    }
    psl->Size++;
}

//尾删
void Popback(Seqlist* psl){
    assert(psl);
    if (psl->Size == 0){
        printf("empty");
        return;
    }
    psl->Size--;
}

//头删
void Popfront(Seqlist* psl){
    int begin = 0;
    assert(psl);
    if (psl->Size == 0){
        printf("empty");
        return;
    }
    else{
        for (begin = 0; begin <= psl->Size - 1; begin++){
            psl->array[begin] = psl->array[begin+1];
        }
    }
    psl->Size--;
}

//下标插
void Insert(Seqlist* psl, size_t pos, Datatype data){
    int begin = 0;
    assert(psl);
    if (pos > MAX_SIZE){
        printf("超范围!");
        return;
    }
    if (psl->Size == MAX_SIZE){
        printf("full");
        return;
    }
    else if (pos <= psl->Size){
        for (begin = psl->Size; begin > pos - 1; begin--){
            psl->array[begin] = psl->array[begin - 1];
        }
        psl->array[pos - 1] = data;
    }
    else{
        printf("位置错误!");
            return;
    }
    psl->Size++;
}

//下标删
void Erase(Seqlist* psl, size_t pos){
    int begin = 0;
    assert(psl);
    if (pos > psl->Size){
        printf("超出范围!");
            return;
    }
    if (psl->Size == 0){
        printf("empty!");
        return;
    }
    for (begin = pos - 1; begin < psl->Size; begin++){
        psl->array[begin] = psl->array[begin + 1];
    }
    psl->Size--;
}

//按值删除,只删遇到的第一个
void Remove(Seqlist* psl, Datatype data){
    int begin = 0;
    int pos = 0;
    assert(psl);
    if (psl->Size == 0){
        printf("empty!");
        return;
    }
    for (begin = 0; begin < psl->Size; begin++){
        if (psl->array[begin] == data){
            for (pos = begin; pos < psl->Size; pos++){
                psl->array[pos] = psl->array[pos + 1];
            }
            psl->Size--;
            return;
        }
    }
    printf("该表没有此元素!");
}

// 按值删除,删除所有的 
void Removeall(Seqlist* psl, Datatype data){
    int begin = 0;
    int count = 0;
    assert(psl);
    if (psl->Size == 0){
        printf("empty!");
        return;
    }
    for (begin = 0; begin < psl->Size; begin++){
        if (psl->array[begin] == data){
            count++;
        }
        else{
            if (count == 0){

            }
            else{
                psl->array[begin - count] = psl->array[begin];
            }
        }
    }
    psl->Size -= count;
}

//清空
void Clear(Seqlist* psl){
    psl->Size = 0;
}

//显示
void show(Seqlist* psl){
    int begin = 0;
    assert(psl);
    if (psl->Size == 0){
        printf("empty!");
        return;
    }
    else{
        for (begin = 0; begin < psl->Size; begin++){
            printf("%d ", psl->array[begin]);
        }
        printf("\n");
    }
}

// 按值查找,返回第一个找到的下标,如果没找到,返回 -1 
int Find(Seqlist* psl, Datatype data){
    int begin = 0;
    int left = 0;
    int right = psl->Size;
    int mid = 0;
    int flag = 1;
    assert(psl);
    if (psl->Size == 0){
        printf("empty!");
        return 0;
    }
    if (data > (psl->Size - 1)){
        printf("没有这个元素!");
        return -1;
    }
    while (flag){
        mid = left + (right - left) / 2;
        if (psl->array[mid] > data){
            right = mid + 1;
        }
        else if (psl->array[mid] < data){
            left = mid;
        }
        else{
            flag = 0;
            return mid + 1;
        }
    }
    return 0;
}

//判断是否为空,1 表示空, 0 表示不空
int Empty(Seqlist* psl){
    assert(psl);
    if (psl->Size == 0){
        return 1;
    }
    else{
        return 0;
    }
}

//返回数量 
int  Size(Seqlist* psl){
    return psl->Size;
}

//销毁 
void Destroy(Seqlist* psl){
    assert(psl);
    free(psl);
    printf("Destory success!");
    return;
}

//bubblesort排序
#if 1
void bubblesort(Seqlist* psl){
    int in = 0;
    int out = 0;
    int temp = 0;
    int count = 0;
    int flag = 0;
    for (out = 0; out < psl->Size - count; in++){
        flag = 0;
        count++;
        for (in = 0; in<psl->Size - count; in++){
            if (psl->array[in]>psl->array[in + 1]){
                temp = psl->array[in];
                psl->array[in] = psl->array[in + 1];
                psl->array[in + 1] = temp;
                flag = 1;
            }
            else{
                ;
            }
            if (flag == 0){
                return;
            }
        }
    }
}
#endif

#if 0
//选择排序
void Selectsort(Seqlist* psl){
    int i = 0;
    int j = 0;
    int count = 0;
    int max = 0;
    int min = 0;
    int imax = psl->array[0];
    int imin = psl->array[0];
    for (i = 0; i < (psl->Size / 2 + 1); i++){
        imax = psl->array[count];
        imin = psl->array[count];
        for (j = count; j < (psl->Size - count); j++){
            if (psl->array[j] >= imax){
                imax = psl->array[j];
                max = j;
            }
            if (psl->array[j] <= imin){
                imin = psl->array[j];
                min = j;
            }
        }
        imin = psl->array[count];
        psl->array[count] = psl->array[min];
        psl->array[min] = imin;

        imax = psl->array[psl->Size - count - 1];
        psl->array[psl->Size - count - 1] = psl->array[max];
        psl->array[max] = imax;
        count++;
    }
}
#endif

然后,在main函数内部写出部分函数实现一下:

#define  _CRT_SECURE_NO_WARNINGS
#include"seqlist.h"
#include"Seqlist.h"
int main(){
    Seqlist psl;
    int y,h,v,t,i,j,k,u,o,temp;
    Datatype data;

    printf("顺序表初始化\n");
    InitSeqlist(&psl);
    printf("please input 10nums!\n");
    for (i = 0; i < 10; i++){                 //这里循环可以设置在100以内,可在头文件修改N值扩大
    printf("please input :");
    scanf("%d", &t);
    Pushback(&psl, t);
    }
    show(&psl);

    printf("\n进行冒泡排序\n");
    bubblesort(&psl);
    show(&psl);

    printf("\n将顺序表中第k个元素赋值为temp\n");
    printf("请输入第k个元素的k值和temp值:\n");
    scanf("%d %d", &k, &temp);
    Insert(&psl, k, temp);
    printf("\n此时顺序表为:\n");
    show(&psl);

    printf("\n在顺序表表尾删除元素\n");
    Popback(&psl);
    printf("此时顺序表为:\n");
    show(&psl);

    printf("\n请输入要删除的数下标:");
    scanf("%d", &y);
    Erase(&psl, y);
    show(&psl);

    printf("\n请输入要删除的数(只删除1个):");
    scanf("%d", &v);
    Remove(&psl, v);
    show(&psl);

    printf("\n请输入要删除的数(全部删除):");
    scanf("%d", &h);
    Removeall(&psl, h);
    show(&psl);


    printf("\n请输入要查找的元素:\n");
    scanf("%d", &j);
    o = Find(&psl, j);
    printf("%d为第%d位:\n", j, o);

    printf("\n输出长度\n");
    u = Size(&psl);
    printf("顺序表的长度为%d\n", u);

    system("pause");
    return 0;
}

下面放出测试图:
c语言实现顺序表各个功能操作函数
可以看出简易实现还是可以的。

如果想要测试更多的功能,可以在main函数里调用这些函数,这里就不再一一测试,
如果有什么建议或者想法,欢迎加好友一起交流!

上一篇: 导出excel

下一篇: C语言实现顺序表