c语言有定义好的线性表和函数,基于线性表的功能函数大全

顺序表

一:线性表的存储结构

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

da9ec0f99be3c707d8186c15bec8e8e4.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时,是指在线性表的末尾插入结点,所以无需移动结点,直接插入即可。

b1b30b0b8b773fe00a8bd86fb0733f46.png

(3)删除操作

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

0231a4c15ef4012f839592414ba91324.png

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

Seqlist.c

#ifndef _SEQLIST_

#define _SEQLIST_

#define MAX 5

#include

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

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(;isize-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(;isize;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(;isize;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(;isize;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(;isize;i++)

{

for(j=0;jsize-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(;isize;i++)

{

min=i;

for(j=min;jsize;j++)

{

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

{

min=j;

}

}

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

}

}

#include

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

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值