线性表的顺序表示及实现_线性表的顺序表示与实现数据实验学会了如何克服困难(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

void sort(SeqList \*List); //Ascend sort
void reverse(SeqList \*List); //reverse

sort对序列进行升序排列,这里使用了选择排序,每次在无序队列中”选择”出最小值,放到有序队列的最前面。
reverse对序列进行反转,这里并没有借助辅助空间,而是在原空间进行反转(in space)。

void show_list(SeqList \*List); //show
int  length(SeqList \* List); //the length of SeqList
void clear(SeqList \*List); //clear
void destroy(SeqList \*List); //destroy

这几个函数并没有太大的技巧。主要完成打印显示、返回当前序列长度、清除序列(List->size=0即可)、销毁序列(一般main函数退出时调用)。

三、代码

SeqList.h


#ifndef \_\_SEQLIST\_H\_\_
#define \_\_SEQLIST\_H\_\_

#include <stdio.h>
#include <malloc.h>
#include <assert.h>


#define SEQLIST\_INIT\_SIZE 8
#define INC\_SIZE 3

typedef int ElemType;


typedef struct SeqList
{
    ElemType * base;     //存储空间基址
    int        capacity; //当前分配的存储容量(以sizeof(ElemType)为单位)
    int        size;     // 实际长度
}SeqList;


//function declaration
void InitSeqList(SeqList *list); //initiation
bool IncSeqList(SeqList *list);  //increase

void push_back(SeqList *List,ElemType item); //tail insert
void show_list(SeqList *List); //show
void push_front(SeqList *List,ElemType item); //head insert
void pop_back(SeqList *List); //pop tail
void pop_front(SeqList *List); //pop head

void insert_pos(SeqList *List,int pos,ElemType item); //insert value at pos
int  find_val(SeqList *List,ElemType item); //find the pos of value
int  length(SeqList * List); //the length of SeqList
void delete_pos(SeqList *List,int pos); //delete value at pos
void delete_val(SeqList *List,ElemType item); //delete value

void sort(SeqList *List); //Ascend sort
void reverse(SeqList *List); //reverse
void clear(SeqList *List); //clear
void destroy(SeqList *List); //destroy
#endif // \_\_SEQLIST\_H\_\_

SeqList.cpp

#include "SeqList.h"

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;
}

//success: true
bool IncSeqList(SeqList *list)
{
    ElemType *newbase = (ElemType*)realloc(list->base,sizeof(ElemType)*(SEQLIST_INIT_SIZE+INC_SIZE));
    if(newbase == NULL)
    {
        printf("Insufficient memory space allocation\n");
        return false;
    }

    list->base = newbase;
    list->capacity = SEQLIST_INIT_SIZE + INC_SIZE;

    return true;
}

//insert
void push_back(SeqList *List,ElemType item)
{

    //原分配空间已满,且增配空间失败
    if(List->size >= List->capacity && !IncSeqList(List))
    {
        printf("SeqList has full,value %d can't insert tail\n",item);
        return ;
    }
    List->base[List->size] = item;

    List->size++;

}
void push_front(SeqList *List,ElemType item)
{
    //原分配空间已满,且增配空间失败
    if(List->size >= List->capacity && !IncSeqList(List))
    {
        printf("SeqList has full,value %d can't insert head\n",item);
        return ;
    }

    //从0开始全部右移1位(如果没有元素,不进入循环)
    for(int i=List->size;i >0; i--)
    {
        List->base[i] = List->base[i-1];
    }

    //坐标为0,插入新元素
    List->base[0] = item;

    //添加了新元素,当前计数+1
    List->size++;
    //printf("hello world \n");
}

void pop_back(SeqList *List)
{
    //如果没有元素
    if(List->size == 0)
    {
        printf("no element,can not delete\n");
        return ;
    }
    printf("delete tail value:%d\n",List->base[List->size-1]);

    //删除(最后)一个元素,当前计数自减
    List->size--;
}
void pop_front(SeqList *List)
{
    //如果没有元素
    if(List->size == 0)
    {
        printf("no element,can not delete\n");
        return ;
    }
    printf("delete head value:%d\n",List->base[0]);

    //从下标1开始全部左移
    for(int i=0;i<List->size-1;i++)
    {
        List->base[i] = List->base[i+1] ;
    }
    //删除(第)一个元素,当前计数自减
    List->size--;
}

void insert_pos(SeqList *List,int pos,ElemType item)
{
    //判断位置是否合法(为0,即头插; 为size即尾插)
    if(pos<0 || pos>List->size)
    {
        printf("insert pos illegal,can't insert\n");
        return ;
    }

    //原分配空间已满,且增配空间失败
    if(List->size >= List->capacity && !IncSeqList(List) )
    {
        printf("SeqList has full,value %d can't insert at pos \n",item);
        return ;
    }

    //size为即将插入位置,全部左移,留出pos
    for(int i=List->size; i>pos; i--)
    {
        List->base[i] = List->base[i-1];
    }

    List->base[pos] = item;

    List->size++;
}

int find_val(SeqList *List,ElemType item)
{
   //找到第一个匹配值的坐标
   for(int i=0;i<List->size;i++)
   {
       if(item == List->base[i])
       {
           return i;
       }
   }

   return -1;
}

int  length(SeqList * List)
{
    return List->size;
}

void  delete_pos(SeqList *List,int pos)
{
    if(pos <0 || pos >= List->size)
    {
        printf("delete pos illegal,can't delete\n");
        return ;
    }

    //从pos+1处全部左移
    for(int i=pos; i<List->size-1;i++)
    {
        List->base[i] = List->base[i+1];
    }

    List->size--;
}

void delete_val(SeqList *List,ElemType item)
{
    int pos;
    pos = find_val(List,item);

    if(pos < 0 )
    {
        printf("value %d not found!\n",item);
        return ;
    }
    delete_pos(List,pos);
}
/\*选择排序:每次在无序队列中"选择"出最小值,放到有序队列的最前\*/
void sort(SeqList *List)
{
    if(List->size == 0 || List->size ==1)
        return;

    int temp;
    int min;
    for(int i=0; i<List->size; i++)
    {
        min = i;
        for(int j= i+1;j<List->size;j++)
        {
            if (List->base[j] < List->base[min])
                min=j;
        }

        //交换最小数
        if(min != i)
        {
            temp =  List->base[min];
            List->base[min] =  List->base[i];
            List->base[i] = temp;
        }

    }

}

void reverse(SeqList *List)
{
    int temp;
    for(int i=0; i<List->size/2; i++)
    {
        temp =  List->base[i];
        List->base[i] =  List->base[List->size-1-i];
        List->base[List->size-1-i] = temp;
    }

}

void clear(SeqList *List)
{
    List->size = 0;
}

void destroy(SeqList *List)
{
    free(List->base);
    List->base = NULL;
    List ->capacity = 0;
    List ->size = 0;

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

    printf("\n");
}


main.cpp

#include "SeqList.h"

int main()
{
    ElemType item;
    SeqList myList;
    InitSeqList(&myList);

    int select = 1;
    int pos=0;
    //int res =0;
    while (select)
    {
        printf("\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\n");
        printf("\* [1] push\_back [2] push\_front \n");
        printf("\* [3] show\_list [4] pop\_back \n");
        printf("\* [5] pop\_front [6] insert\_pos \n");
        printf("\* [7] find\_value [8] length \n");
        printf("\* [9] delete\_pos [10] delete\_val\n");
        printf("\* [11] sort [12] reverse \n"  );


![img](https://img-blog.csdnimg.cn/img_convert/c44a120e0af97dd53554a2256e291352.png)
![img](https://img-blog.csdnimg.cn/img_convert/5664be97aa8dd04d2069515fae754d4f.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

elete\_val\n");
        printf("\* [11] sort [12] reverse \n"  );


[外链图片转存中...(img-eVzBulX5-1715886339439)]
[外链图片转存中...(img-zILAvweU-1715886339440)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值