顺序表的实现---动态
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;
}
以上是关于顺序表的实现---动态的主要内容,如果未能解决你的问题,请参考以下文章