顺序表的实现---动态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序表的实现---动态相关的知识,希望对你有一定的参考价值。

“Seq_D.h”

#ifndef __SEQ_LIST_H__

#define __SEQ_LIST_H__

#define INIT_SIZE 2

#define INC 2


#include <stdio.h>

#include <assert.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>


typedef int DataType;


typedef struct SeqList

{

DataType *data;//指向空间的指针

int size;//有效个数

int capacity;//容量

}SeqList, *pSeqList;


void InitSeqList(pSeqList pSeq);//初始化

void CheckCapacity(pSeqList pSeq);//扩容

void Destory(pSeqList pSeq);//销毁

void PrintSeqList(SeqList Seq);//打印


void PushBack(pSeqList pSeq, DataType x);//尾插

void PopBack(pSeqList pSeq);//尾删

void PushFront(pSeqList pSeq, DataType x);//头插

void PopFront(pSeqList pSeq);//头删



void Insert(pSeqList pSeq, int pos, DataType x);//在某一位置上插入某一元素

void Remove(pSeqList pSeq, DataType x);//删除x元素

void RemoveAll(pSeqList pSeq, DataType x);//删除所有x元素


int Find(SeqList Seq, DataType x);//查找某一元素


void ReverseList(pSeqList pSeq);//逆置


void SortList(pSeqList pSeq);//排序

int BinarySearch(SeqList Seq, DataType x);//二分查找


void InitSeqList(pSeqList pSeq)

{

assert(pSeq);

pSeq->data = (DataType *)malloc(INIT_SIZE*sizeof(DataType));

memset(pSeq->data,0,INIT_SIZE*sizeof(DataType));

pSeq->capacity = INIT_SIZE;

pSeq->size = 0;

}


void CheckCapacity(pSeqList pSeq)

{

assert(pSeq);

if(pSeq->capacity == pSeq->size)

{

//printf("扩容");

pSeq->data = (DataType *)realloc(pSeq->data,(pSeq->capacity+INC)*sizeof(DataType));

pSeq->capacity = pSeq->capacity+INC;

}

}


void PushBack(pSeqList pSeq, DataType x)

{

CheckCapacity(pSeq);

pSeq->data[pSeq->size] = x;

pSeq->size++;

}


void PrintSeqList(SeqList Seq)  //打印

{

int i = 0;

for(i=0;i<Seq.size;i++)

{

printf("%d ",Seq.data[i]);

}

printf("over\n");

}


void Destory(pSeqList pSeq)

{

assert(pSeq);

free(pSeq);

pSeq->data = NULL;

pSeq->size = 0;

pSeq->capacity = 0;

}


void PopBack(pSeqList pSeq)

{

assert(pSeq);

if(pSeq->size == 0)

{

printf("顺序表已空\n");

return;

}

else

{

pSeq->size--;

}

}


void PushFront(pSeqList pSeq, DataType x)

{

int i = 0;

assert(pSeq);

CheckCapacity(pSeq);

if(pSeq->size == 0)

{

pSeq->data[pSeq->size] = x;

pSeq->size++;

}

else

{

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

{

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

}

pSeq->data[0] = x;

pSeq->size++;

}

}


void PopFront(pSeqList pSeq)

{

int i = 0;

assert(pSeq);

if(pSeq->size == 1)

{

pSeq->size--;

}

else

{

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

{

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

}

pSeq->size--;

}

}


void Insert(pSeqList pSeq, int pos, DataType x)

{

int j = 0;

assert(pSeq);

CheckCapacity(pSeq);

if(pos<=0 || pos>pSeq->capacity)

{

printf("插入的位置不合法");

return;

}

for(j=pSeq->size-1;j>=pos-1;j--)

{

pSeq->data[j+1]=pSeq->data[j];

}

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

pSeq->size++;

}

void Remove(pSeqList pSeq, DataType x)

{

int i = 0;

int j = 0;

assert(pSeq);

if(pSeq->size == 1)

{

pSeq->size--;

return;

}

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

{

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

{

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

{

pSeq->data[j] = pSeq->data[j+1];

}

pSeq->size--;

return;

}

}  

}

void RemoveAll(pSeqList pSeq, DataType x)

{

int i = 0;

int j = 0;

assert(pSeq);

if(pSeq->size == 1)

{

pSeq->size--;

return;

}

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

{

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

{

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

{

pSeq->data[j] = pSeq->data[j+1];

}

pSeq->size--;

}

}

}


void ReverseList(pSeqList pSeq)

{

DataType left = 0;

DataType right = pSeq->size-1;

DataType tmp;

assert(pSeq);

while(left<right)

{

tmp = pSeq->data[left];

pSeq->data[left] = pSeq->data[right];

pSeq->data[right] = tmp;

left++;

right--;

}

}



void SortList(pSeqList pSeq)//冒泡

{

DataType i = 0;

DataType j = 0;

DataType tmp;

assert(pSeq);

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

{

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

{

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

{

tmp = pSeq->data[j];

pSeq->data[j] = pSeq->data[j+1];

pSeq->data[j+1] = tmp;

}

}

}


}


int Find(SeqList Seq, DataType x)

{

DataType i = 0;

for(i=0;i<Seq.size;i++)

{

if(Seq.data[i] == x)

{

return i;

}

}

return -1;

}

int BinarySearch(SeqList Seq, DataType x)

{

DataType left = 0;

DataType right = Seq.size-1;

DataType mid = (left+right)/2;

while(left<=right)

{

if(Seq.data[mid]<x)

{

left = mid+1;

}

if(Seq.data[mid]>x)

{

right = mid-1;

}

if(Seq.data[mid] == x)

{

return Seq.data[mid];

}

}

}

#endif  //__SEQ_LIST_H__



“test.c”

#include "Seq_D.h"


void Test1()  //尾插尾删

{

SeqList mylist;

  InitSeqList(&mylist);

PushBack(&mylist,1);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

//PopBack(&mylist);

    PrintSeqList(mylist);

}

void Test2()//头插头删

{

SeqList mylist;

InitSeqList(&mylist);

PushFront(&mylist,1);

PushFront(&mylist,2);

PushFront(&mylist,3);

PushFront(&mylist,4);

//PopFront(&mylist);

    PrintSeqList(mylist);

}

void Test3()

{

SeqList mylist;

InitSeqList(&mylist);

PushBack(&mylist,1);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

PrintSeqList(mylist);

printf("\n");

    Insert(&mylist,2,5);

    PrintSeqList(mylist);

}

void Test4()//删除

{

SeqList mylist;

InitSeqList(&mylist);

PushBack(&mylist,1);

    PushBack(&mylist,3);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

    Remove(&mylist, 3);

//RemoveAll(&mylist, 3);

    PrintSeqList(mylist);

}

void Test5()//逆置

{

SeqList mylist;

InitSeqList(&mylist);

PushBack(&mylist,1);

    PushBack(&mylist,3);

PushBack(&mylist,2);

PushBack(&mylist,3);

PushBack(&mylist,4);

ReverseList(&mylist);

PrintSeqList(mylist);

}

void Test6()//冒泡

{

SeqList mylist;

InitSeqList(&mylist);

PushFront(&mylist,1);

PushFront(&mylist,2);

PushFront(&mylist,3);

PushFront(&mylist,4);

SortList(&mylist);

    PrintSeqList(mylist);

}


void Test7()//二分查找

{

SeqList mylist;

DataType ret = 0;

InitSeqList(&mylist);

PushFront(&mylist,1);

PushFront(&mylist,2);

PushFront(&mylist,3);

PushFront(&mylist,4);

ret=Find(mylist,3);

    printf("%d ",ret);

/*ret=BinarySearch(mylist,3);

printf("%d ",ret);*/

}

int main()

{

Test7();

return 0;

}


以上是关于顺序表的实现---动态的主要内容,如果未能解决你的问题,请参考以下文章

数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析

❤❤❤❤顺序表的实现(c语言)----数据结构

❤❤❤❤顺序表的实现(c语言)----数据结构

❤❤❤❤顺序表的实现(c语言)----数据结构

顺序表的实现---动态

数据结构—动态顺序表的实现