您的位置:首页 > 其它

顺序表(动态)

2017-06-05 18:40 141 查看

用动态开辟内存的方式写一个列表

SeqList.h

#ifndef _SEQLIST_H__
#define _SEQLIST_H__
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <stdlib.h>

#define TYPES "%d"
#define INIT_SZ 2//初始化的容量
#define ADD_SZ 2//每次扩容增加的容量

typedef int DataType;//为实现各种类型的列表,命名int为DataType

typedef struct Seqlist
{
DataType *List;
int sz;//有效大小
int capacity;//容量
}Seqlist, *pSeqlist;

void InitSeqlist(pSeqlist p);//初始化
void PushBack(pSeqlist p, DataType d);//尾插
void PrintSeqlist(pSeqlist p);//打印
void PopBack(pSeqlist p);//尾删
void PushFront(pSeqlist p,DataType d);//头插
void PopFront(pSeqlist p);//头删
void Insert(pSeqlist p, int pos,DataType d);//指定位置插入
int Find(pSeqlist p, DataType d);//遍历查找
void Remove(pSeqlist p, DataType d);//删除
void ReverseSeqlist(pSeqlist p);//逆序
void SortSeqlist(pSeqlist p);//冒泡排序
int BinarySearch(pSeqlist p, DataType d);//二分查找,返回ret为元素所在列表位置下标
void Expansion(pSeqlist p);//扩容

#endif //_SEQLIST_H__


SeqList.c

#include "SeqList.h"

void InitSeqlist(pSeqlist p)//初始化
{
assert(p);
p->List = malloc(INIT_SZ*sizeof(Seqlist));
if (p->List==NULL)
{
perror("Failed to open up\n");
return ;
}
//memset(p, 0, sizeof(Seqlist));
p->sz=0;
p->capacity=INIT_SZ;
}
void Expansion(pSeqlist p)//扩容
{
DataType *tmp = realloc(p->List, (p->capacity+ADD_SZ)*sizeof(Seqlist));
assert(p);
if(tmp==NULL)
{
perror("Failed to add\n");
return ;
}
p->List=tmp;
p->capacity+=ADD_SZ;

}
void PushBack(pSeqlist p, DataType d)//尾插
{
assert(p);
if(p->sz==p->capacity)
{
Expansion(p);
printf("扩容成功\n");
}
p->List[p->sz]=d;
p->sz++;
}
void PrintSeqlist(pSeqlist p)//打印
{
int i=0;
assert(p);
if(p->sz==0)
{
printf("列表为空\n");
return ;
}
for (i=0; i<p->sz; i++)
{
printf(TYPES,p->List[i]);
}
printf("\n");
}
void PopBack(pSeqlist p)//尾删
{
assert(p);
//p->List[p->sz-1]=0;
p->sz--;
}
void PushFront(pSeqlist p,DataType d)//头插
{
int i=0;
assert(p);
if(p->sz==p->capacity)
{
Expansion(p);
printf("扩容成功\n");
}
for (i=p->sz; i>0; i--)
{
p->List[i]=p->List[i-1];
}
p->List[0]=d;
p->sz++;
}
void PopFront(pSeqlist p)//头删
{
int i=0;
assert(p);
for(i=0; i<p->sz-1; i++)
{
p->List[i]=p->List[i+1];
}
p->sz--;
}
void Insert(pSeqlist p, int pos,DataType d)//指定位置插入
{
int i = 0;
assert(p);
if(p->sz==p->capacity)
{
Expansion(p);
printf("扩容成功\n");
}
for (i=p->sz; i>pos; i--)
{
p->List[i]=p->List[i-1];
}
p->List[pos]=d;
p->sz++;
}
int Find(pSeqlist p, DataType d)//遍历查找
{
int i = 0;
assert(p);
for (i=0; i<p->sz; i++)
{
if(p->List[i]==d)
{
return i;
}
}
if(i==p->sz)
{
printf("没找着\n");
}
return -1;
}
void Remove(pSeqlist p, DataType d)//删除
{
int ret=Find(p, d);
assert(p);
if(ret==-1)
{
printf("没有此元素\n");
}
else
{
int i = 0;
for(i=ret; i<p->sz-1; i++)
{
p->List[i]=p->List[i+1];
}
p->sz--;
}
}
void ReverseSeqlist(pSeqlist p)//逆序
{
int left=0;
int right=p->sz-1;
assert(p);
while (left<right)
{
DataType tmp = p->List[left];
p->List[left] = p->List[right];
p->List[right] = tmp;
left++;
right--;
}
}
void SortSeqlist(pSeqlist p)//冒泡排序
{
int i=0;
assert(p);
for (i=0; i<p->sz-1; i++)
{
int j=0;
for (j=0; j<p->sz-i-1; j++)
{
if(p->List[j]>p->List[j+1])
{
DataType tmp = p->List[j];
p->List[j] = p->List[j+1];
p->List[j+1] = tmp;
}
}
}
}
int BinarySearch(pSeqlist p, DataType d)//二分查找,默认顺序从小到大
{
int left=0;
int right=p->sz-1;
assert(p);
while (left<=right)
{
int mid = left+(right-left)/2;
if(p->List[mid]>d)
{
right=mid;
}
else if(p->List[mid]<d)
{
left=mid;
}
else
{
return mid;
}
}
return -1;
}


test.c

#include "SeqList.h"
void test1()
{
Seqlist seqlist;
int ret = 0;
InitSeqlist(&seqlist);//初始化

bd35
PushBack(&seqlist, 1);//尾插
PushBack(&seqlist, 2);
PushBack(&seqlist, 3);
PushBack(&seqlist, 4);
printf("尾插1、2、3、4:");
PrintSeqlist(&seqlist);//打印
PopBack(&seqlist);//尾删  PopBack(&seqlist);
printf("尾删:");
PrintSeqlist(&seqlist);
PushFront(&seqlist, 0);//头插
printf("头插0:");
PrintSeqlist(&seqlist);
PopFront(&seqlist);//头删
printf("头删:");
PrintSeqlist(&seqlist);
Insert(&seqlist, 1, 5);//指定位置插入
printf("在1位置插入5:");
PrintSeqlist(&seqlist);
ret = Find(&seqlist, 5);
printf("ret = %d\n", ret);
Remove(&seqlist, 5);//删除
printf("删除5这个元素:");
PrintSeqlist(&seqlist);
}
void test2()
{
Seqlist seqlist;
int ret = 0;
InitSeqlist(&seqlist);//初始化
PushBack(&seqlist, 1);//尾插
PushBack(&seqlist, 2);
PushBack(&seqlist, 3);
PushBack(&seqlist, 4);
PrintSeqlist(&seqlist);
ReverseSeqlist(&seqlist);//逆序
printf("逆序:");
PrintSeqlist(&seqlist);
SortSeqlist(&seqlist);//排序
printf("排序:");
PrintSeqlist(&seqlist);
ret = BinarySearch(&seqlist, 2);//二分查找,返回ret为元素所在列表位置下标
printf("二分查找元素2:");
printf("ret = %d\n", ret);
}
int main()
{
test1();
//test2();
return 0;
}


test1



test2

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态内存 顺序表