首页 > 其他分享 >01手写顺序表

01手写顺序表

时间:2023-08-05 15:44:06浏览次数:43  
标签:01 return pSqlist int list pos 顺序 last 手写

一、简介

学习数据结构的第一个程序,手写实现顺序表。

实现功能

  • 创建表
  • 清空表中元素
  • 判断表中数据是否为空
  • 求表中有效数据长度
  • 指定数据元素定位
  • 指定位置插入元素
  • 释放空间
  • 打印顺序表的内容
  • 删除指定位置上的元素

二、完整代码

sqlist.h

#ifndef __SQLIST_H
#define __SQLIST_H

#include <stdio.h>
#define N 128

typedef int dataType; // 表内元素的类型
typedef struct
{
    int last;
    dataType arr[N];
} *pSqlist, Sqlist;

// 函数
pSqlist CreateSqlisst(void);
int ClearSqlist(pSqlist list);
int SqlistIsEmpty(pSqlist list);
int LengthOfSqlist(pSqlist list);
int LocateElement(pSqlist list, dataType val);
int InsertElement(pSqlist list, int pos, dataType val);
int SqlistFree(pSqlist list);
void ShowList(pSqlist list);
int DeleteElement(pSqlist list, int pos);

#endif

sqlist.c

#include "sqlist.h"
#include <stdlib.h>
#include <string.h>

pSqlist CreateSqlisst(void)
{
    pSqlist list;
    list = (pSqlist)malloc(sizeof(Sqlist));

    if (list == NULL)
    {
        printf("list malloc failed\n");
        return list;
    }

    // initialize
    memset(list, 0, sizeof(Sqlist));
    list->last = -1;

    return list;
}

/**
 * @brief Clear all elements in the list
 *
 * @param list
 * @return int 0:success -1:failed
 */
int ClearSqlist(pSqlist list)
{
    if (list == NULL)
    {
        return -1;
    }

    memset(list, 0, sizeof(Sqlist));
    list->last = -1;

    return 0;
}

/**
 * @brief
 *
 * @param list
 * @return int 1£ºempty 0£ºnot empty
 */
int SqlistIsEmpty(pSqlist list)
{
    if (list->last == -1)
    {
        return 1;
    }

    return 0;
}

/**
 * @brief return the length of the list
 *
 * @param list
 * @return int
 */
int LengthOfSqlist(pSqlist list)
{
    if (list == NULL)
    {
        return -1;
    }

    return list->last + 1;
}

/**
 * @brief return the pos of specific element
 *
 * @param list
 * @param val
 * @return int -1:failed
 */
int LocateElement(pSqlist list, dataType val)
{
    if (list == NULL)
    {
        return -1;
    }

    for (size_t i = 0; i <= list->last; i++)
    {
        if (list->arr[i] == val)
        {
            return i;
        }
    }

    return -1;
}

/**
 * @brief Insert element into specific pos of the list
 *
 * @param pos
 * @param val
 * @return int
 */
int InsertElement(pSqlist list, int pos, dataType val)
{
    // full
    if (list->last == N - 1)
    {
        printf("list is full\n");
        return -1;
    }

    // check para    0<=pos<=Last+1   [0, last+1]
    if (pos < 0 || pos > list->last + 1)
    {
        printf("Pos is invalid\n");
        return -1;
    }

    // move
    for (int i = list->last; i >= pos; i--)
    {
        list->arr[i + 1] = list->arr[i];
    }

    // update value last
    list->arr[pos] = val;
    list->last++;

    return 0;
}

void ShowList(pSqlist list)
{
    if (list == NULL)
    {
        printf("Show list error,the list is null\n");
        return;
    }

    if (list->last == -1)
    {
        printf("There is no element in the list\n");
        return;
    }

    for (size_t i = 0; i <= list->last; i++)
    {
        printf("%d ", list->arr[i]);
    }
    printf("\n");
}

int SqlistFree(pSqlist list)
{
    if (list == NULL)
        return -1;
    free(list);
    list = NULL;
    return 0;
}

int DeleteElement(pSqlist list, int pos)
{
    if (list->last == -1 || list == NULL)
    {
        printf("The list is null or empty\n");
        return -1;
    }

    if (pos > list->last || pos < 0)
    {
        printf("The pos is invalid\n");
        return -1;
    }

    for (int i = pos + 1; i <= list->last; i++)
    {
        list->arr[i - 1] = list->arr[i];
    }

    list->last--;
    return 0;
}

三、总结

待实现的接口

  1. 给两个顺序表求并集
  2. 去掉顺序表的相同元素
  3. 为表内元素进行排序

程序缺陷

  1. 插入元素时不能够动态扩展数据区的大小
  2. 顺序存储方式需要连续的内存空间
  3. 插入或删除操作需要更多的时间移动元素,效率低下

调试总结

/**
 * @brief Insert element into specific pos of the list
 *
 * @param pos
 * @param val
 * @return int
 */
int InsertElement(pSqlist list, int pos, dataType val)
{
    // full
    if (list->last == N - 1)
    {
        printf("list is full\n");
        return -1;
    }

    // check para    0<=pos<=Last+1   [0, last+1]
    if (pos < 0 || pos > list->last + 1)
    {
        printf("Pos is invalid\n");
        return -1;
    }

    // move
    for (int i = list->last; i >= pos; i--)
    {
        list->arr[i + 1] = list->arr[i];
    }

    // update value last
    list->arr[pos] = val;
    list->last++;

    return 0;
}

该函数的第一个版本在move那一步循环的遍历变量选择了编辑器默认的 size_t 为 i 的类型,该类型是一种可以指类型,其本质是unsigned long long。所以该循环不能够遍历到负数,由于顺序表初始化时将list->last的值初始化为 -1 ,导致程序运行时产生了段错误。

标签:01,return,pSqlist,int,list,pos,顺序,last,手写
From: https://www.cnblogs.com/goldenFantome/p/17608033.html

相关文章

  • 数据结构-算法-01-算法初步
     ......
  • CH182H与RTL8201F功能对比
    1、CH182H简介CH182H是一款支持Auto-MDIX的工业级10/100M以太网PHY收发器。CH182H内部包括物理编码子层(PCS)、物理介质接入层(PMA)、双绞线物理介质相关子层(TP-PMD)、10BASE-TX编码器/解码器、双绞线介质连接单元(TPMAU)、MII和RMII接口等以太网Transceiver功能所需的模块。CH182H与......
  • 总结: [01背包] 空间优化后内层循环为啥是逆序的?
    总结:[01背包] 空间优化后内层循环为啥是逆序的?首先,这是一个困扰了不少人的问题,虽然网上有挺多的解释,但是有的想起来比较费劲,于是乎,就有了这篇题解题目分析首先,01背包问题是一个非常非常非常经典的动态规划问题(后文简称“动规”或“dp”)。 因为百度百科上的题目分析......
  • [刷题笔记] Luogu P2014 [CTSC1997] 选课
    ProblemSolution我们发现本题中有好多主从关系,即要想取用一个儿子必须先取用她的父亲。构成了一个森林,处理不便。有个小技巧,就是将0号节点参与建树,最后所求节点数就变成了\(m+1\),且把森林变成了一棵树。然后如何处理呢?再次理解题意,我们发现,我们每次的决策是是否取用儿子,取用......
  • [译]2011年移动开发者经济学报告(五)
    哪可以赚钱第二部分将应用推向市场(上)开发者历程移动开发过程复杂,不只是“想法idea”到“应用app”两个步骤。今天的全球应用市场,将想法推向市场需要数十个步骤,仅列几项:计划,开发,调测,论坛支持,测试框架,打包,定价,发布,计费,市场,销售跟踪,用户支持和应用更新。我们用一个非常重要的图来阐述......
  • [译]移动开发在2010年及以后的商用发展走势(七)
    在www.visionmobile.com/rsc/researchreports/MobileDeveloperEconomics2010ReportFINAL.pdf,是一篇很好的文章,想翻译出来,但是逐字翻译,没什么耐性,习惯于散漫自由,且一字一句的翻译,通常有中英文的逻辑差异,也担心翻译得不准确,有不少需要借助Google的翻译,所以还是以笔记的学习方式......
  • 集合(京东2017秋招)
     1#include<stdio.h>2#include<math.h>3intmain(){4inti=0,j,k,h=0,total=0;5intnm[5][2],a[5][10000],b[5][10000],c[20000];6while(scanf("%d%d",&nm[i][0],&nm[i][1])!=EOF){7for(j=0;j<nm[i][0];j++)......
  • [代码随想录]Day09-栈与队列part01
    题目:232.用栈实现队列思路:因为go没有栈和队列的类型,直接自己写就行了。比较简单的实现,具体看代码中的注释。代码:typeMyQueuestruct{numbers[]int}funcConstructor()MyQueue{returnMyQueue{numbers:[]int{}}}func(this*MyQueue)Push(xint){......
  • P4795 [BalticOI 2018] 基因工程 题解
    题目传送门:Click。蒟蒻看见这道题,想了足足一个小时,过后顿有所悟,故作此篇。首先,看到题目,光是数据就已经达到了\(\operatorname{O}(nm)\)的级别,再看一看数据范围:\(3\leqn,m\leq4,100\)。显然是一道时间复杂度为\(\operatorname{O}(n,m)\)级别的题目。本蒟蒻首先观察了样......
  • 漏洞复现报告:CVE-2019-2890 反序列化漏洞
    OracleWebLogicServer漏洞研究报告一、漏洞信息搜集1.1漏洞信息表漏洞名称OracleWebLogicServer反序列化漏洞发布时间2019年10月16日漏洞编号CVE-2019-2890威胁类型反序列化漏洞危害级别高危影响版本OracleWebLogicServer10.3.6.0.0、12.1.3.0.0、12.2.1.3.0、12.2.1.4.0......