顺序表


 一:线性表的存储结构

    顺序表的顺序存储是指一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构中相邻的元素存储在连续的物理存储单元中。采用顺序存储结构存储的线性表通常简称顺序表,可将顺序表归纳为:关系线性化,结点顺序存

                         wKioL1abTG-AKO41AAAWivxsfMQ094.png

   用C语言定义线性表的顺序存储表示

     #define MAXSIZE 100

     Typedef struct

     {

      ElemType elem[MAXSIZE];

      int last;

     }

二:线性表顺序存储结构上的基本运算

(1)查找操作

    查找可采用顺序查找,即从第一个元素开始,依次将表中元素与查找元素比较,若相等,则查找成功,返回元素下标,不相等查找失败,返回-1。

(2)插入操作

    用顺序表作为线性表的存储结构时,由于结点的物理顺序必须与结点的逻辑顺序保持一致,因此必须将表中n,n-1,...,i上的结点,依次后移到位置n+1,n,...,i+1上,空出第i个位置,然后在位置上插入新的结点。特别地,当i=n+1时,是指在线性表的末尾插入结点,所以无需移动结点,直接插入即可。

wKioL1abVdXinXTCAAAXmjrqxBE538.png

(3)删除操作

    线性表的删除是指将表的第i(1<=i<=n)个元素删去,同理由于顺序表的存储特点,必须将原表中在i+1,i+2,...,n-1,n上的结点,依次前移到位置i,i+1,..,n-1。


wKiom1abVhCiaOSjAAAUWVy-iGM897.png

三:基于顺序表的各个功能函数

Seqlist.c


#ifndef _SEQLIST_

#define _SEQLIST_

#define MAX 5

#include<stdlib.h>

typedef int DataType;

typedef struct SeqList

{

DataType array[MAX];

size_t size;

}SeqList;

void PrintSeqList(SeqList* pSeq);

void InitSeqList(SeqList* pSeq);

void PushBack(SeqList* pSeq,DataType x);

void PopBack(SeqList* pSeq);

void PushFront(SeqList* pSeq,DataType x);

void PopFront(SeqList* pSeq);

void Insert(SeqList* pSeq,size_t pos,DataType x);

int find(SeqList* pSeq,DataType x);

void Erase(SeqList* pSeq,size_t pos);

void Remove(SeqList* pSeq,DataType x);

void RemoveALL(SeqList* pSeq,DataType x);

void BubbleSort(SeqList* pSeq);

void SelectSort(SeqList* pSeq);

#endif


Seqlist.h


#include"Seqlist.h"

#include<stdio.h>

void static Swap(DataType *left,DataType *right)

{

DataType tmp=*left;

*left=*right;

*right=tmp;

}

void PrintSeqList(SeqList* pSeq)

{

size_t i=0;

if(pSeq->size==0)

{

printf("%d",pSeq->array[i]);

}

printf("\n");

return;

}


void InitSeqList(SeqList* pSeq)

{

pSeq->size=0;

}


void PushBack(SeqList* pSeq,DataType x)

{

if(pSeq->size==MAX)

{

printf("线性表已满\n");

return;

}

pSeq->array[pSeq->size++]=x;

return;

}



void PopBack(SeqList* pSeq)

{

if(pSeq->size==0)

{

printf("线性表为空,删除失败");

return;

}

pSeq->size--;

return;

}


void PushFront(SeqList* pSeq,DataType x)

{

size_t i=pSeq->size;

if(pSeq->size==MAX)

{

printf("线性表已满");

return;

}

for(;i>0;i--)

{

  pSeq->array[i]=pSeq->array[i-1];  

}

pSeq->array[i]=x;

pSeq->size++;

return;

}

void PopFront(SeqList* pSeq)

{

size_t i=0;

if(pSeq->size==0)

{

printf("线性表为空\n");

return;

}

for(;i<pSeq->size-1;i++)

{

pSeq->array[i]=pSeq->array[i+1];

}

pSeq->size--;

return;

}

void Insert(SeqList* pSeq,size_t pos,DataType x)

{

size_t i=pSeq->size;

if(pSeq->size==MAX)

{

printf("线性表已满,无法插入\n");

return;

}

for(;i>=pos-1;i--)

{

pSeq->array[i]=pSeq->array[i-1];

}

pSeq->array[pos-1]=x;

pSeq->size++;

}

int Find(SeqList* pSeq,DataType x)

{

size_t i=0;

for(;i<pSeq->size;i++)

{

if(pSeq->array[i]==x)

return i+1;

}

return -1;

}

void Erase(SeqList* pSeq,size_t pos)

{

size_t i=0;

if(pSeq->size==0)

{

printf("线性表为空,无法删除\n");

return;

}

if(pos>pSeq->size)

{

printf("给出位置不在线性表范围内,无法删除\n");

return;

}

  i=pos-1;

for(;i<pSeq->size;i++)

{

pSeq->array[i]=pSeq->array[i+1];

}

pSeq->size--;

}

void Remove(SeqList* pSeq,DataType x)

{

Erase(pSeq,Find(pSeq,x));

}

void RemoveALL(SeqList* pSeq,DataType x)

{

size_t i=0;

size_t count=0;

for(;i<pSeq->size;i++)

{

if(pSeq->array[i]==x)

{

count++;

}

else

{

pSeq->array[i-count]=pSeq->array[i];

}

}

pSeq->size-=count;

}

void BubbleSort(SeqList* pSeq)

{

size_t i=0;

size_t j=0;

for(;i<pSeq->size;i++)

{

for(j=0;j<pSeq->size-i-1;j++)

{

if(pSeq->array[j]>pSeq->array[j+1])

{

Swap(&pSeq->array[j],&pSeq->array[j+1]);

}

}

}

}

void SelectSort(SeqList* pSeq)

{

size_t min;

size_t i=0;

size_t j=0;

for(;i<pSeq->size;i++)

{

min=i;

for(j=min;j<pSeq->size;j++)

{

if(pSeq->array[min]>pSeq->array[j])

{

min=j;

}

}

Swap(&pSeq->array[i],&pSeq->array[min]);

}

}


#include<stdio.h>

#include"Seqlist.h"

void test1(SeqList* pSeq)

{

InitSeqList(pSeq);

PrintSeqList(pSeq);

PushBack(pSeq,1);

PushBack(pSeq,2);

PushBack(pSeq,3);

PushBack(pSeq,4);

PushBack(pSeq,5);

PushBack(pSeq,5);

PrintSeqList(pSeq);

PopBack(pSeq);

PopBack(pSeq);

PopBack(pSeq);

PopBack(pSeq);

PopBack(pSeq);

PrintSeqList(pSeq);

PushFront(pSeq,5);

PushFront(pSeq,4);

PushFront(pSeq,3);

PushFront(pSeq,2);

PushFront(pSeq,1);

PushFront(pSeq,1);

PrintSeqList(pSeq);

}

void test2(SeqList* pSeq)

{

InitSeqList(pSeq);

PushBack(pSeq,1);

PushBack(pSeq,2);

PushBack(pSeq,3);

PushBack(pSeq,4);

PushBack(pSeq,5);

PrintSeqList(pSeq);

PopFront(pSeq);

PopFront(pSeq);

PopFront(pSeq);

PopFront(pSeq);

PopFront(pSeq);

PopFront(pSeq);

}

void test3(SeqList* pSeq)

{

InitSeqList(pSeq);

PushBack(pSeq,1);

PushBack(pSeq,3);

PushBack(pSeq,4);

PushBack(pSeq,5);

PrintSeqList(pSeq);

Insert(pSeq,2,2);

PrintSeqList(pSeq);

Insert(pSeq,2,2);

}

void test4(SeqList* pSeq)

{

InitSeqList(pSeq);

PushBack(pSeq,1);

PushBack(pSeq,2);

PushBack(pSeq,3);

PushBack(pSeq,4);

PushBack(pSeq,5);

PrintSeqList(pSeq);

Erase(pSeq,2);

PrintSeqList(pSeq);

}

void test5(SeqList* pSeq)

{

    InitSeqList(pSeq);

PushBack(pSeq,1);

PushBack(pSeq,2);

PushBack(pSeq,3);

PushBack(pSeq,1);

PushBack(pSeq,5);

PrintSeqList(pSeq);

RemoveALL(pSeq,1);

PrintSeqList(pSeq);

}

void test6(SeqList* pSeq)

{

InitSeqList(pSeq);

PushBack(pSeq,2);

PushBack(pSeq,4);

PushBack(pSeq,3);

PushBack(pSeq,1);

PushBack(pSeq,5);

PrintSeqList(pSeq);

BubbleSort(pSeq);

PrintSeqList(pSeq);

}

void test7(SeqList* pSeq)

{

InitSeqList(pSeq);

PushBack(pSeq,2);

PushBack(pSeq,4);

PushBack(pSeq,3);

PushBack(pSeq,1);

PushBack(pSeq,5);

PrintSeqList(pSeq);

SelectSort(pSeq);

PrintSeqList(pSeq);

}

int main()

{

SeqList SL;

test1(&SL);

test2(&SL);

test3(&SL);

printf("%d\n",Find(&SL,5));

test4(&SL);

test5(&SL);

test6(&SL);

test7(&SL);

return 0;

}