简单顺序表的插入,删除,指定位置,指定元素的插入删除操作

头文件 SeqList.h

#ifndef __SEQLIST_H__

#define __SEQLIST_H__
#include<stdio.h>
#include<string.h>
#include<assert.h>

#define MAX_SIZE 10
typedef int DataType;
typedef unsigned int size_t;

typedef struct SeqList
{
    DataType array[MAX_SIZE];
    size_t size;
}SeqList, *PSeqList;

// 初始化顺序表
void InitSeqList(PSeqList seqList);

// 顺序表尾插
// 设计函数原型
// 参数检测
// 边界条件考虑
// 逻辑操作

// 尾插
void PushBack(PSeqList pSeqList, DataType data);
// 尾删
void PopBack(PSeqList pSeqList);

// 打印顺序表
void PrintSeqList(PSeqList pSeqList);

// 头插
void PushFront(PSeqList pSeqList, DataType data);

// 头删
void PopFront(PSeqList pSeqList);

// 任意位置插入
void Insert(PSeqList pSeqList, size_t pos, DataType data);

// 在顺序表中查找元素data
int Find(PSeqList pSeqList, DataType data);

// 删除顺序表中pos位置上的元素
void Erase(PSeqList pSeqList, size_t pos);

//移除顺序表中的元素data
void Remove(PSeqList pSeqList, DataType data);

// 移除顺序表中所有元素data
void RemoveAll(PSeqList pSeqList, DataType data);

#endif

实现函数 SeqList.c

#include "SeqList.h"

void InitSeqList(PSeqList seqList)// 初始化顺序表
{
    memset(seqList->array, 0, MAX_SIZE*sizeof(DataType));
    seqList->size = 0;
}

// 打印顺序表
void PrintSeqList(PSeqList pSeqList)
{
    size_t i = 0;
    if (pSeqList->size == 0)
    {
        printf("线性表为空,打印结束\n");
        return;
    }
    for (i = 0; i < pSeqList->size; i++)
    {
        printf("%d  ", pSeqList->array[i]);
    }
    printf("\n");
}

void PushBack(PSeqList pSeqList, DataType data)//从尾部插入
{
    assert(pSeqList);//判断指针是否为空
    if ((pSeqList->size) >= MAX_SIZE)
    {
        printf("线性表已满,无法继续插入\n");
        return;
    }
    pSeqList->array[pSeqList->size] = data;
    pSeqList->size++;

}

void PopBack(PSeqList pSeqList)//从尾部删除
{
    assert(pSeqList);
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    pSeqList->size--;
    printf("删除成功\n");
}

void PushFront(PSeqList pSeqList, DataType data)//从首部插入
{
    size_t i = pSeqList->size;
    assert(pSeqList);//判断指针是否为空
    if ((pSeqList->size) >= MAX_SIZE)
    {
        printf("线性表已满,无法继续插入\n");
        return;
    }
    while (i)
    {
        pSeqList->array[ i ] = pSeqList->array[i-1];
        i--;
    }
    pSeqList->array[0] = data;
    printf("插入完成\n");
    pSeqList->size++;
}

void PopFront(PSeqList pSeqList)//删除最前面一个
{
    size_t i = 0;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    for (i = 0; i < pSeqList->size-1; i++)
    {
        pSeqList->array[i] = pSeqList->array[i + 1];
    }
    pSeqList->size--;
    printf("删除完成\n");
}

int Find(PSeqList pSeqList, DataType data)//在顺序表内查找某元素
{
    size_t i = 0;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return -1;
    }
    for (i = 0; i < pSeqList->size - 1; i++)
    {
        if (pSeqList->array[i] == data)
        {
            return i;
        }
    }
    return -1;
}

void Insert(PSeqList pSeqList, size_t pos, DataType data)//在任意位置插入元素
{
    size_t i = pSeqList->size;
    assert(pSeqList);//判断指针是否为空
    if ((pSeqList->size) >= MAX_SIZE)
    {
        printf("线性表已满,无法继续插入\n");
        return;
    }
    if (pos > pSeqList->size)
    {
        printf("插入位置不被允许\n");
        return;
    }
    for (i = pSeqList->size; i >pos; i--)
    {
        pSeqList->array[i] = pSeqList->array[i - 1];

    }
    pSeqList->array[pos] = data;
    pSeqList->size++;
    printf("添加完成\n");
}

// 删除顺序表中pos位置上的元素
void Erase(PSeqList pSeqList, size_t pos)
{
    size_t i = pos;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    if (pos > pSeqList->size)
    {
        printf("删除位置有误\n");
        return;
    }

    for (i = pos; i < pSeqList->size-1; i++)
    {
        pSeqList->array[i] = pSeqList->array[i + 1];
    }
    pSeqList->size--;
    printf("删除完成\n");
}

void RemoveAll(PSeqList pSeqList, DataType data)
{
    size_t i = 0;
    assert(pSeqList);//判断指针是否为空
    if (pSeqList->size == 0)
    {
        printf("线性表为空\n");
        return;
    }
    for (i = 0; i < pSeqList->size; i++)
    {
        if (pSeqList->array[i] == data)
        {
            size_t j = i;
            while (j< pSeqList->size-1)
            {
                pSeqList->array[j] = pSeqList->array[j + 1];
                j++;
            }
            pSeqList->size--;
            printf("已删除一个元素\n");
            i--;
        }
    }
    printf("删除完成\n");
}

void Remove(PSeqList pSeqList, DataType data)
{
    size_t i = 0;
    assert(pSeqList);//判断指针是否为空
    i = Find(pSeqList, data);
    if (i >= 0)
    {
        while (i < pSeqList->size - 1)
        {
            pSeqList->array[i] = pSeqList->array[i + 1];
            i++;
        }
        pSeqList->size--;
        printf("删除完成\n");
        return;
    }
    else
    {
        printf("没有找到该元素");
        return;
    }
}

测试程序 test.c (可分三次测试)

#include "SeqList.h"

static void test1(PSeqList seqList)
{

    InitSeqList(seqList);
    PushBack(seqList, 1);
    PushBack(seqList, 2);
    PushBack(seqList, 3);
    PushBack(seqList, 4);
    PrintSeqList(seqList);
    PopBack(seqList);
    PrintSeqList(seqList);
}

static void test2(PSeqList seqList)
//测试PushFront ,PrintSeqList,PopFront等函数
{
    int ret = 0;
    InitSeqList(seqList);
    PushFront(seqList, 1);
    PushFront(seqList, 2);
    PushFront(seqList, 3);
    PushFront(seqList, 4);
    PrintSeqList(seqList);
    PopFront(seqList);
    PopFront(seqList);
    PopFront(seqList);
    PopFront(seqList);
    PopFront(seqList);
    PrintSeqList(seqList);
}

static void test3(PSeqList seqList)//测试Insert,Erase,Remove,RemoveALL函数
{
    int ret = 0;
    InitSeqList(seqList);
    PushFront(seqList, 1);//在首部加入 1
    PushFront(seqList, 2);
    PushFront(seqList, 3);
    PushFront(seqList, 4);
    Insert(seqList, 3, 5);//在下标3的位置插入 5
    PrintSeqList(seqList);
    Erase(seqList, 3);//删除下标3位置上的元素
    PrintSeqList(seqList);
    Insert(seqList, 3, 2);
    Insert(seqList, 3, 2);
    PrintSeqList(seqList);
    Remove(seqList, 2);//删除第一个 2
    PrintSeqList(seqList);
    RemoveAll(seqList, 2);//删除所有的 2
    PrintSeqList(seqList);
}
static void test4(PSeqList seqList)//测试Find函数
{
    int ret = 0;
    InitSeqList(seqList);
    PushFront(seqList, 1);
    PushFront(seqList, 2);
    PushFront(seqList, 3);
    PushFront(seqList, 4);
    ret = Find(seqList, 2);
    printf("%d", ret);
}

int main()
{
    SeqList seqList;
    /*test1(&seqList);*/
    /*test2(&seqList);*/
    test3(&seqList);
    /*test4(&seqList);*/

    system("pause");
    return 0;
}
时间: 2024-10-11 10:27:51

简单顺序表的插入,删除,指定位置,指定元素的插入删除操作的相关文章

一个简单顺序表的基本操作

#include <stdio.h>#include <stdlib.h>#define Max_Size 100 /*线性表可能达到的最大长度*/typedef int DataType;typedef struct List{ DataType data[Max_Size]; /*用于存放数据元素数组 */ int length; /* 当前表长度*/}SeqList; void InitList (SeqList &L){ L.length=0;} int Loc

页面滚到到指定位置,元素的绝对定位和相对定位的自由转换

var $goTop = $("#goTop"); //需要操作的对象 $(window).scroll(function(){ var scrollHeight = $(window).scrollTop();//这个方法是当前滚动条滚动的距离 var height = $("body").height() - scrollHeight - $(window).height() + $goTop.height();//整个页面的高度-滚动条的高度-当前窗口的高度

数据结构关于简单顺序表的构建(C++)

//使用结构体构造线性表typedef struct SeqList { ElemType *elem; size_t capacity; size_t size; }SeqList; //使用模板类来构造线性表const int DefaultSize = 100; template<typename Type> class SeqList { public: SeqList(int sz = DefaultSize):m_nmaxsize(sz),m_ncurrentsize(-1) {

一个简单顺序表的C++实现

/* SList.cpp Author: Qiang Xiao Time: 2015-07-11 */ #include<iostream> using namespace std; const int MAX_LENGTH= 20; class SList{ private: int max_len; int arr[MAX_LENGTH]; int len; public: SList(int a[], int len); bool append(int); bool insert(int

删除vector指定位置的元素

原文链接: http://www.cnblogs.com/yeahgis/archive/2012/05/29/2523476.html #include <vector>#include <iostream>using namespace std; int main(int argc, char** argv) {     std::vector<int> vec;     for(int i=0;i<100;i++)     {          vec.pu

数据结构与算法学习 第1季01 顺序表 链表

2015年学习计划安排: http://www.cnblogs.com/cyrus-ho/p/4182275.html 顺序表:顺序存储结构的线性表.所谓顺序存储结构,就是指用一组连续地址的内存单元来存储整张线性表的存储结构.(因此按序遍历数据很方便,直接做指针偏移就可以了.) 常用操作 A)向顺序表中第i个位置插入元素item 1. 判断插入位置是否合法 2. 将i-1以后的元素后移一个元素的位置(注意静态顺序表和动态顺序表的差异)--- 从原来最后一个元素开始操作到原来的第i个元素,依次后移

顺序表的创建、初始化、查找、删除、插入和合并

本文参考国家精品课程耿国华的数据结构写的,发现了书上的一些问题,并做了简单修正,补足了整个程序过程,若有不足,请跟帖指正!!! #include<iostream> #include<cstdio> using namespace std; #define MAXSIZE 100 #define ERROR 0 #define OK 1 typedef int ElemType; typedef struct { ElemType *elem; int last; }SqList;

顺序表的查找、插入、删除、合并操作及其优缺点

顺序表的查找.插入.删除.合并操作,用c++实现相关代码: #include<iostream> using namespace std; //定义线性表顺序存储结构 #define MAXSIZE 100  //线性表最大长度 typedef struct { //线性表占用数组空间 int elem[MAXSIZE]; //记录线性表中最后一个元素在数组elem[]中的位置(下标值),空表置为-1 int last; }SeqList; //顺序表的按内容查找运算 //在顺序表L中查找与e

[转载(有删改)] 顺序表

申明:转自    http://www.cnblogs.com/Romi/archive/2012/01/07/2315788.html 一个线性表是n个数据元素的有限序列,线性结构的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素,以元素在计算机内"物理位置相邻"来表示线性表中数据元素之间的逻辑关系. 线性表的顺序存储结构是一种随机存取的存储结构,通常用数组来描述数据结构中的顺序存储结构. 以下将从(顺序表构造——顺序表初始化——插入元素——删除元素——元素比较——两个