您的位置:首页 > 其它

动态实现顺序表

2016-06-03 00:31 190 查看

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

下面来进行顺序表的动态实现

头文件

#ifndef __SEQLIST_D_H__
#define __SEQLIST_D_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#define MAX 1000
#define DEFAULT_SIZE 3
typedef int DataType;
typedef struct SeqList
{
DataType* data;
int size;
int capacity;
}SeqList,*pSeqList;
void PrintSeqList(pSeqList pSeq);//打印函数
void DestroySeqList(pSeqList pSeq);//销毁函数
void InitSeqList(pSeqList pSeq);//初始化函数
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);//制定数删除
void RemoveAll(pSeqList pSeq,DataType x);//删除所有
void Bubblesort(pSeqList pSeq);//冒泡排序
void Erase(pSeqList pSeq,int pos);//指定为删除
int BinarySearch(pSeqList pSeq,DataType x);//二分查找法
#endif//__SEQLIST_D_H__

函数实现部分

#include"SeqList_D.h"
void PrintSeqList(pSeqList pSeq)
{
assert(pSeq);
DataType i=0;
for(i=0;i<pSeq->size;i++)
{
printf("%3d",pSeq->data[i]);
}
printf("\n");

}
void InitSeqList(pSeqList pSeq)
{
assert(pSeq);
pSeq->data =(DataType*)malloc(pSeq->capacity *sizeof(DataType));
if(pSeq->data ==NULL)
{
memset(pSeq->data ,0,pSeq->capacity *sizeof(DataType));
exit(EXIT_FAILURE);
}
pSeq->size =0;
pSeq->capacity=DEFAULT_SIZE;

}
void DestroySeqList(pSeqList pSeq)
{

free(pSeq->data );
pSeq->data =NULL;
pSeq->capacity=0;
pSeq->size=0;
}
void capacity(pSeqList pSeq)//扩容函数
{
assert(pSeq);
if(pSeq->size == pSeq->capacity)
{
DataType *tmp=(DataType *)realloc(pSeq->data,(pSeq->capacity+=DEFAULT_SIZE)*sizeof(DataType));
if(tmp == NULL)
{
printf("out of memory\n");
exit(EXIT_FAILURE);
}
else
{
pSeq->data=tmp;
pSeq->capacity+=DEFAULT_SIZE;
}
}
}
void PushBack(pSeqList pSeq,DataType x)
{
assert(pSeq);
capacity(pSeq);

if (pSeq->size == pSeq->capacity)
{
return;
}
pSeq->data[pSeq->size++] = x;

}
void PopBack(pSeqList pSeq)
{
assert(pSeq);
if (pSeq->size == 0)
{
return;
}
pSeq->size--;
}
void PushFront(pSeqList pSeq,DataType x)
{
assert(pSeq);
capacity(pSeq);
int i = 0;

for (i = (pSeq->size); i >= 0; i--)
{
pSeq->data[i] = pSeq->data[i-1];
}
pSeq->data[0] = x;
pSeq->size++;

}
void PopFront(pSeqList pSeq)
{
int i=0;
assert(pSeq);
if(pSeq->size==0)
{
return ;
}
for(i=0;i<pSeq->size-1;i++)
{
pSeq->data[i]=pSeq->data[i+1];
}
pSeq->size--;
}
void Insert(pSeqList pSeq,int pos,DataType x)
{
int i=0;
assert(pSeq);
capacity(pSeq);
if(pos<1)
{
return ;
}
for(i=(pSeq->size)-1;i>=pos-1;i--)
{
pSeq->data[i+1]=pSeq->data[i];
}
pSeq->data[pos - 1] = x;
pSeq->size++;

}
void Remove(pSeqList pSeq,DataType x)
{
int i=0,j=0;
assert(pSeq);
if(pSeq->size==0)
{
return;
}
if(pSeq->data[i]==x)
{
for(i=0;i<pSeq->size;i++)
{
pSeq->data[j]=pSeq->data[j+1];
}
pSeq->size--;
}
}
void RemoveAll(pSeqList pSeq,DataType x)
{
int i=0,j=0;
assert(pSeq);
for(i=0;i<pSeq->size;i++)
{
if(pSeq->data[i]=x)
{
for(j=i;j<pSeq->size-1;j++)
{
pSeq->data[j]=pSeq->data[j+1];
}
pSeq->size--;
}
else
i++;
}
}
void Bubblesort(pSeqList pSeq)
{
assert(pSeq);
int i = 0;
int j = 0;
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])
{
DataType temp = pSeq->data[j];
pSeq->data[j] = pSeq->data[j + 1];
pSeq->data[j + 1] = temp;
}
}
}
}
void Erase(pSeqList pSeq,int pos)
{
int i=0;
if(pos == -1)
{
printf("找不到要删除对象\n");
return;
}
for(i = pos; i < pSeq->size; i++)
{
pSeq->data[i] = pSeq->data[i+1];
}
pSeq->size--;
printf("删除成功\n");
}
int BinarySearch(pSeqList pSeq,DataType x)
{
int mid = 0;
int left = 0;
int right = (pSeq->size) - 1;
assert(pSeq);
if (pSeq->size == 0)
{
return 0;
}
Bubblesort(pSeq);
while (left <= right)
{
mid = (left + right) / 2;
if (x > pSeq->data[mid])
{
left = mid+1;
}
else if (x < pSeq->data[mid])
{
right = mid-1;
}
else
{
return mid;
}
}
return -1;

}


测试代码

#include"SeqList_D.h"
int main()
{
SeqList pSeq;
InitSeqList(&pSeq);
PushBack(&pSeq,1);
PushBack(&pSeq,2);
PushBack(&pSeq,3);
PushBack(&pSeq,9);
PushBack(&pSeq,5);
PushBack(&pSeq,8);
PushBack(&pSeq,7);
PrintSeqList(&pSeq);
Bubblesort(&pSeq);
PopFront(&pSeq);
PrintSeqList(&pSeq);
Insert(&pSeq,3,10);
PrintSeqList(&pSeq);
Bubblesort(&pSeq);
PrintSeqList(&pSeq);
int ret = BinarySearch(&pSeq,5);
printf("在第%d个位置\n", ret+1);
system("pause");
return 0;
}


测试部分读者有兴趣可以自行添加测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: