最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言如何實現(xiàn)順序表(數(shù)據(jù)結(jié)構(gòu))

 更新時間:2023年08月18日 09:40:11   作者:桜キャンドル淵  
這篇文章主要介紹了C語言如何實現(xiàn)順序表(數(shù)據(jù)結(jié)構(gòu))問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

以下是我們需要實現(xiàn)的順序表的功能。 

以下是寫在SeqList.h中的內(nèi)容,我們將全部需要聲明的內(nèi)容放在此處

pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SLDateType;
typedef struct SeqList
{
    SLDateType* a;
    size_t size;// 當前存儲的數(shù)據(jù)個數(shù)
    size_t capacity; //允許的最大容量
}SeqList;
// 對數(shù)據(jù)的管理:增刪查改
void SeqListInit(SeqList* ps);//初始化順序表
void SeqListDestory(SeqList* ps);//摧毀順序表
void SLCheckCapacity(SeqList * ps);//檢查空間是否充足
void SeqListPrint(SeqList* ps);//打印列表中的所有元素的值
void SeqListPushBack(SeqList* ps, SLDateType x);//在表尾插入數(shù)據(jù)
void SeqListPushFront(SeqList* ps, SLDateType x);//在表頭位置插入數(shù)組
void SeqListPopFront(SeqList* ps);//彈出列表的首個元素
void SeqListPopBack(SeqList* ps);//彈出列表的尾元素
// 順序表查找
int SeqListFind(SeqList* ps, SLDateType x);
// 順序表在pos位置插入x
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x);
// 順序表刪除pos位置的值
void SeqListErase(SeqList* ps, size_t pos);

接下來我們來實現(xiàn)函數(shù)具體的功能

以下代碼是寫在SeqList.c中的內(nèi)容

一、初始化順序表

這里我們用assert判斷ps是否為NULL,也就是我們的順序表是否創(chuàng)建成功。

如果創(chuàng)建成功,我們就將順序表中的數(shù)組,當前的元素個數(shù),順序表的大小初始化。

并且打印初始化成功來提示我們完成了初始化。

#include"SeqList.h"
void SeqListInit(SeqList* ps)
{
    assert(ps);
    ps->a=NULL;
    ps->capacity=0;
    ps->size=0;
    printf("初始化列表成功\n");
}

二、從表尾插入元素

在用assert實現(xiàn)斷言之后,我們用(四)中的函數(shù)功能檢查ps當前的空間是否充足,在空間充足之后,我們在順序表的表尾添加我們的新元素。

void SeqListPushBack(SeqList* ps, SLDateType x)
{
    assert(ps);
    SLCheckCapacity(ps);
    ps->a[ps->size]=x;
    ps->size++;
    printf("已成功添加至表尾\n");
}

三、打印順序表

在斷言之后,我們按照順序挨個打印順序表中的元素。

void SeqListPrint(SeqList* ps)
{
    assert(ps);
    for(int i=0;i<ps->capacity;i++)
    {
        printf("%d\t",ps->a[i]);
    }
    printf("\n");
    printf("成功打印\n");
}

四、檢查順序表的空間是否充足

當我們判斷當前的已經(jīng)含有的元素個數(shù)和總的存儲空間大小相同的時候,先判斷當前元素大小是不是0,如果是0,我們就將新的元素個數(shù)賦值為4,如果不是0,也就是不是初始化之后,我們將我們的元素個數(shù)×2。

當然,我們的realloc函數(shù)存在開辟空間失敗的問題,我們需要進行一定的判斷。

void SLCheckCapacity(SeqList * ps)
{
    if (ps->size == ps->capacity)
    {
        int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        SLDateType* tmp = (SLDateType*)realloc(ps->a, newCapacity*sizeof(SLDateType));
        if (tmp == NULL)
        {
            printf("realloc fail\n");
            //exit(-1);
            return;
        }
        ps->a = tmp;
        ps->capacity = newCapacity;
    }
}

五、在順序表表首插入元素

我們需要先將順序表中的每個元素后移一位,然后在表首的位置插入我們需要插入的元素。

void SeqListPushFront(SeqList* ps, SLDateType x)
{
    assert(ps);
    SLCheckCapacity(ps);
    for(int end=ps->size;end>=0;end--)
    {
        ps->a[end+1]=ps->a[end];
    }
    ps->a[0]=x;
    printf("在表首元素插入成功\n");
}

六、摧毀數(shù)據(jù)表

摧毀數(shù)據(jù)表我們需要將數(shù)據(jù)表的數(shù)組指針置空,將其中的元素個數(shù)和大小全部賦零。

void SeqListDestory(SeqList* ps)
{
    assert(ps);
    ps->a=NULL;
    ps->capacity=0;
    ps->size=0;
    printf("摧毀列表成功\n");
}

七、彈出順序表的首元素

將首元素彈出并且打印之后,我們將首元素之后的元素每一個元素往前移動。

void SeqListPopFront(SeqList* ps)
{
    assert(ps);
    if(ps->a[0]!=NULL)
    {
        int temp=ps->a[0];
        printf("數(shù)組的首元素是%d,已成功從列表中彈出\n",temp);
        for(int i=0;i<ps->capacity-1;i++)
        {
            ps->a[i]=ps->a[i+1];
        }
        ps->capacity-=1;
    }
    else
    {
        printf("當前列表為空,無法彈出首元素\n");
    }
}

八、彈出順序表的表尾元素

將表尾的元素打印,并且將總的元素個數(shù)-1

void SeqListPopBack(SeqList* ps)
{
    assert(ps);
    printf("數(shù)組的尾元素是%d,已成功從列表中彈出\n",ps->a[ps->capacity-1]);
    ps->capacity-=1;
}

九、查找順序表中的元素,并返回第一次出現(xiàn)的位置

我們采用for循環(huán)的形式查找順序表中指定元素的位置,然后返回其下標。

int SeqListFind(SeqList* ps, SLDateType x)
{
    assert(ps);
    for(int i=0;i<ps->capacity;i++)
    {
        if(ps->a[i]==x)
        {
            printf("在順序表的%d位置(此處為真實位置-1)查找到了%d元素\n",i,x);
            return i;
        }
    }
    printf("查找不到該元素\n");
    return -1;
}

十、在指定位置插入元素

在指定位置插入元素,我們需要將指定位置之后的元素后移一位,為我們的指定位置的元素騰出空間,然后將我們的元素插入。

void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
{
    assert(ps);
    assert(pos >= 0 && pos <= ps->size);
    //檢查空間
    ps->capacity++;
    SLCheckCapacity(ps);
    for(int end=ps->size;end>=pos;end--)
    {
        ps->a[end]=ps->a[end-1];
    }
    ps->a[pos-1]=x;
    printf("已經(jīng)在列表的%d位置成功插入%d元素\n",pos,x);
}

十一、刪除指定位置的元素

我們將指定位置之后的元素挨個往前移動,就能夠刪除指定位置的元素。

void SeqListErase(SeqList* ps, size_t pos)
{
    assert(ps);
    assert(pos >= 0 && pos <= ps->size);
    for(int i=pos;i<ps->capacity-1;i++)
    {
        ps->a[i-1]=ps->a[i];
    }
    ps->capacity--;
    printf("已經(jīng)成功刪除列表%d位置處的元素\n",pos);
}

接下來就是我們的測試代碼

以下代碼寫在test.c文件中

#include "SeqList.h"
int main() {
    SeqList sl;
    SeqListInit(&sl);
    SeqListPushBack(&sl,10);
    SeqListPushBack(&sl,1);
    SeqListPushBack(&sl,20);
    SeqListPushBack(&sl,30);
    SeqListPushFront(&sl, 8);
    SeqListPrint(&sl);
    SeqListPopFront(&sl);
    SeqListPrint(&sl);
    printf("%d",sl.capacity);
    SeqListPopBack(&sl);
    SeqListPrint(&sl);
    SeqListFind(&sl,0);
    SeqListInsert(&sl,4, 10);
    SeqListPrint(&sl);
    SeqListErase(&sl,3);
    SeqListPrint(&sl);
    SeqListDestory(&sl);
    printf("程序已完成執(zhí)行");
    return 0;
}

以下是SeqList.c中代碼的合集 

//
// Created by 楊凱亮 on 2022/4/22.
//
#include"SeqList.h"
void SeqListInit(SeqList* ps)
{
    assert(ps);
    ps->a=NULL;
    ps->capacity=0;
    ps->size=0;
    printf("初始化列表成功\n");
}
void SeqListPushBack(SeqList* ps, SLDateType x)
{
    assert(ps);
    SLCheckCapacity(ps);
    ps->a[ps->size]=x;
    ps->size++;
    printf("已成功添加至表尾\n");
}
void SeqListPrint(SeqList* ps)
{
    assert(ps);
    for(int i=0;i<ps->capacity;i++)
    {
        printf("%d\t",ps->a[i]);
    }
    printf("\n");
    printf("成功打印\n");
}
void SLCheckCapacity(SeqList * ps)
{
    if (ps->size == ps->capacity)
    {
        int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        SLDateType* tmp = (SLDateType*)realloc(ps->a, newCapacity*sizeof(SLDateType));
        if (tmp == NULL)
        {
            printf("realloc fail\n");
            //exit(-1);
            return;
        }
        ps->a = tmp;
        ps->capacity = newCapacity;
    }
}
void SeqListPushFront(SeqList* ps, SLDateType x)
{
    assert(ps);
    SLCheckCapacity(ps);
    for(int end=ps->size;end>=0;end--)
    {
        ps->a[end+1]=ps->a[end];
    }
    ps->a[0]=x;
    printf("在表首元素插入成功\n");
}
void SeqListDestory(SeqList* ps)
{
    assert(ps);
    ps->a=NULL;
    ps->capacity=0;
    ps->size=0;
    printf("摧毀列表成功\n");
}
void SeqListPopFront(SeqList* ps)
{
    assert(ps);
    if(ps->a[0]!=NULL)
    {
        int temp=ps->a[0];
        printf("數(shù)組的首元素是%d,已成功從列表中彈出\n",temp);
        for(int i=0;i<ps->capacity-1;i++)
        {
            ps->a[i]=ps->a[i+1];
        }
        ps->capacity-=1;
    }
    else
    {
        printf("當前列表為空,無法彈出首元素\n");
    }
}
void SeqListPopBack(SeqList* ps)
{
    assert(ps);
    printf("數(shù)組的尾元素是%d,已成功從列表中彈出\n",ps->a[ps->capacity-1]);
    ps->capacity-=1;
}
int SeqListFind(SeqList* ps, SLDateType x)
{
    assert(ps);
    for(int i=0;i<ps->capacity;i++)
    {
        if(ps->a[i]==x)
        {
            printf("在順序表的%d位置(此處為真實位置-1)查找到了%d元素\n",i,x);
            return i;
        }
    }
    printf("查找不到該元素\n");
    return -1;
}
void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
{
    assert(ps);
    assert(pos >= 0 && pos <= ps->size);
    //檢查空間
    ps->capacity++;
    SLCheckCapacity(ps);
    for(int end=ps->size;end>=pos;end--)
    {
        ps->a[end]=ps->a[end-1];
    }
    ps->a[pos-1]=x;
    printf("已經(jīng)在列表的%d位置成功插入%d元素\n",pos,x);
}
void SeqListErase(SeqList* ps, size_t pos)
{
    assert(ps);
    assert(pos >= 0 && pos <= ps->size);
    for(int i=pos;i<ps->capacity-1;i++)
    {
        ps->a[i-1]=ps->a[i];
    }
    ps->capacity--;
    printf("已經(jīng)成功刪除列表%d位置處的元素\n",pos);
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言for循環(huán)嵌套for循環(huán)在實踐題目中應(yīng)用詳解

    C語言for循環(huán)嵌套for循環(huán)在實踐題目中應(yīng)用詳解

    初學C語言,常常遇到for循環(huán)中嵌套個for循環(huán),初學者對于這種形式總是一知半解,這次我就整理了常見的for循環(huán)嵌套for循環(huán)的題目,我們一起爭取一舉拿下這類題。學廢他們,以后再見到就不怕啦!每天都要學一點呀。加油,奮斗的我們
    2022-05-05
  • C++中Boost庫安裝使用指南(VS2022?+?vcpkg)

    C++中Boost庫安裝使用指南(VS2022?+?vcpkg)

    本文主要介紹了C++中Boost庫安裝使用指南(VS2022?+?vcpkg),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06
  • 基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解

    基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解

    本篇文章是對Sizeof與Strlen的區(qū)別以及聯(lián)系的使用進行了詳細的介紹。需要的朋友參考下
    2013-05-05
  • C語言高效編程的幾招小技巧

    C語言高效編程的幾招小技巧

    這篇文章主要介紹了C語言高效編程的幾招小技巧,本文講解了以空間換時間、用數(shù)學方法解決問題以及使用位操作等編輯技巧,并給出若干方法和代碼實例,需要的朋友可以參考下
    2015-05-05
  • C語言由淺入深了解變量的應(yīng)用

    C語言由淺入深了解變量的應(yīng)用

    這篇文章主要介紹了C語言的變量,變量是C語言語法和語義中一個很重要的知識點,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Opencv3.4.0實現(xiàn)視頻中的幀保存為圖片功能

    Opencv3.4.0實現(xiàn)視頻中的幀保存為圖片功能

    這篇文章主要為大家詳細介紹了Opencv3.4.0實現(xiàn)視頻中的幀保存為圖片功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 詳解C++異常處理三個重要組成部分

    詳解C++異常處理三個重要組成部分

    這篇文章主要為大家介紹了C++異常處理的三個重要組成部分示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • C++數(shù)據(jù)精度問題的解決方案(對浮點數(shù)保存指定位小數(shù))

    C++數(shù)據(jù)精度問題的解決方案(對浮點數(shù)保存指定位小數(shù))

    對浮點數(shù)保存指定位小數(shù),怎么解決這個問題呢?如果有小伙伴對C++數(shù)據(jù)精度問題的解決方案感興趣的朋友一起看看吧
    2017-08-08
  • C語言實現(xiàn)紙牌24點小游戲

    C語言實現(xiàn)紙牌24點小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)紙牌24點小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • c++實現(xiàn)簡單的線程池

    c++實現(xiàn)簡單的線程池

    本文介紹的線程池采用C++語言,在windows平臺下實現(xiàn)。本著技術(shù)分享的精神寫作本文同時公布源代碼。歡迎大家指出該線程池存在的問題并對當前性能進行討論。
    2015-03-03

最新評論

兴和县| 稻城县| 涞水县| 陈巴尔虎旗| 六安市| 拜城县| 鄂伦春自治旗| 九江县| 岳阳县| 信宜市| 安新县| 宁蒗| 万安县| 云和县| 巴林右旗| 铁岭市| 海兴县| 汤原县| 化德县| 从江县| 泸水县| 驻马店市| 桐乡市| 柯坪县| 滨州市| 平安县| 定西市| 亚东县| 东台市| 德阳市| 原阳县| 绿春县| 涟水县| 万盛区| 嫩江县| 怀化市| 赣榆县| 崇阳县| 丘北县| 长宁区| 清流县|