线性数据结构可分为:
1.顺序表:连续的空间,通过数组实现(seqlist);
2.链表:存储空间不连续,分为:单向链表、双向链表、循环链表(linklist);
顺序表与链表的比较:
1.顺序表的存储空间连续,便于访问特定的元素;链表的存储空间不连续,数组元素之间使用指针相连,每个数据元
素只能访问周围的一个元素(单向链表);
2.链表要访问特定元素,只能从链表头开始,直至遍历到钙元素;
3.在顺序表中添加,删除元素时间复杂度为O(n);在链表中插入删除元素时,不涉及其他元素的移动,因此时间复杂度为O(1);
首先介绍顺序表的实现:动态开辟内存空间,创建顺序表
具体代码如下:
#ifndef _SEQLIST_D_H__//防止头文件被重定义
#define _SEQLIST_D_H__
#include
//所引用的库函数
#include
#include
#include
#define DEFAULT_SZ 3//动态顺序表的默认大小
#define DEFAULT_INC 2//默认的增容大小
typedef int DataType;//数据类型的定义
typedef struct SeqList//定义顺序表的元素
{
DataType* p_data;
int sz;
int capacity;
}SeqList,*pSeqList;
void InitSeqList(pSeqList ps);//初始化顺序表
void PushBack(pSeqList ps,DataType x);//尾部删除
void PopBack(pSeqList ps);//尾部元素的删除
void PushFront(pSeqList ps,DataType x);//首部插入
void PopFront(pSeqList ps);//头部删除
void Sort(pSeqList ps);//排序
void Reserve(pSeqList ps);//逆序
int BinarySearch(pSeqList ps,int left,int right,int key);//对已排序的顺序表进行二分查找
void Insert(pSeqList ps,int pos,DataType x);//指定位置插入
void Remove(pSeqList ps,DataType x);//指定元素删除
void RemoveAll(pSeqList ps,DataType x);//指定所有元素删除
void Erase(pSeqList ps,int pos);//指定位置删除
int Find(const pSeqList ps,DataType x,int start);//查找指定元素
void Display(const pSeqList ps);//顺序表的打印
void Destory(pSeqList ps);//顺序表的销毁
#endif //_SEQLIST_D_H__#include "SeqList_d.h"
void InitSeqList(pSeqList ps)
{
ps->p_data=(DataType *)malloc(DEFAULT_SZ*sizeof(DataType));
if(ps->p_data==NULL)
{
perror("InitSeqList()::malloc");
exit(1);
}
ps->sz=0;
ps->capacity=DEFAULT_SZ;
memset(ps->p_data,0,ps->capacity*sizeof(DataType));
}
void CheckCapacity(pSeqList ps)
{
assert(ps);
if(ps->sz==ps->capacity)
{
DataType *p=realloc(ps->p_data,(DEFAULT_SZ+DEFAULT_INC)*sizeof(DataType));
if(p!=NULL)
{
ps->p_data=p;
ps->capacity+=DEFAULT_INC;
memset(ps->p_data+ps->sz,0,DEFAULT_INC*sizeof(DataType));
}
else
{
perror("CheckCapacity()::realloc");
exit(1);
}
}
}
void PushBack(pSeqList ps,DataType x)//尾部插入
{
assert(ps);
CheckCapacity(ps);
ps->p_data[ps->sz]=x;
ps->sz++;
}
void PopBack(pSeqList ps)
{
if(ps->sz==0)
{
return;
}
ps->sz--;
}
void PushFront(pSeqList ps,DataType x)//首部插入
{
int i=0;
assert(ps);
CheckCapacity(ps);
for(i=ps->sz;i>0;i--)
{
ps->p_data[i]=ps->p_data[i-1];
}
//memset(ps->p_data+1,ps->p_data,ps->sz*sizeof(DataType))
ps->p_data[0]=x;
ps->sz ++;
}
void PopFront(pSeqList ps)//头部删除
{
int i=0;
assert(ps);
if(ps->sz==0)
{
return;
}
for(i=0;i
sz;i++) { ps->p_data[i]=ps->p_data[i+1]; } ps->sz--; } void Sort(pSeqList ps)//排序 { int i=0; int j=0; assert(ps); if((ps->sz)<2) { return; } for(i=0;i
sz-1;i++) { for(j=0;j
sz-1-i;j++) { if(ps->p_data[j]>ps->p_data[j+1]) { DataType tmp=ps->p_data[j]; ps->p_data[j]=ps->p_data[j+1]; ps->p_data[j+1]=tmp; } } } } int BinarySearch(pSeqList ps,int left,int right,DataType key)//对已排序的顺序表进行二分查找 { assert(ps); while(left<=right) { int mid=left+((right-left)>>1); if(ps->p_data[mid]>key) { right=mid-1; } else if(ps->p_data[mid]
sz;i++) { if(ps->p_data[i]==x) { return i; } } return -1; } void Insert(pSeqList ps,int pos,DataType x)//指定位置插入 { int i=0; assert(ps); CheckCapacity(ps); for(i=ps->sz;i>pos;i--) { ps->p_data[i]=ps->p_data[i-1]; } ps->p_data[pos]=x; ps->sz++; } void Erase(pSeqList ps,int pos)//指定位置删除 { int i=0; assert(ps); if(ps->sz==0) { return; } if((pos<0)&&(pos>ps->sz)) { printf("指定的位置有误!\n"); } for(i=pos;i
sz;i++) { ps->p_data[i]=ps->p_data[i+1]; } ps->sz--; } void Remove(pSeqList ps,DataType x)//指定元素删除 { int pos=0; assert(ps); pos=Find(ps,x,0); if(pos==-1) { printf("指定元素不存在!\n"); } else { int i=0; for(i=pos;i
sz;i++) { ps->p_data[i]=ps->p_data[i+1]; } ps->sz--; } } void RemoveAll(pSeqList ps,DataType x)//指定所有元素删除 { int pos=0; int start=0; assert(ps); while(start
sz) { pos=Find(ps,x,start); if(pos==-1) { printf("指定元素不存在!\n"); return; } else { start=pos; pos=Find(ps,x,start); Erase(ps,pos); } } } void Reserve(pSeqList ps)//逆序 { int left=0; int right=ps->sz-1; assert(ps); while(left
p_data[left]; ps->p_data[left]=ps->p_data[right]; ps->p_data[right]=tmp; left++; right--; } } void Display(const pSeqList ps) { int i=0; assert(ps); if(ps->sz==0) { return; } for(i=0;i
sz;i++) { printf("%d ",ps->p_data[i]); } printf("\n"); } void Destory(pSeqList ps) { free(ps->p_data); ps->p_data=NULL; ps->capacity=0; ps->sz=0; }
#include "SeqList_d.h"
void InitSeqList(pSeqList ps)//顺序表的初始化
{
ps->p_data=(DataType *)malloc(DEFAULT_SZ*sizeof(DataType));
if(ps->p_data==NULL)
{
perror("InitSeqList()::malloc");
exit(1);
}
ps->sz=0;
ps->capacity=DEFAULT_SZ;
memset(ps->p_data,0,ps->capacity*sizeof(DataType));
}
void CheckCapacity(pSeqList ps)//检测容量
{
assert(ps);
if(ps->sz==ps->capacity)
{
DataType *p=realloc(ps->p_data,(DEFAULT_SZ+DEFAULT_INC)*sizeof(DataType));
if(p!=NULL)
{
ps->p_data=p;
ps->capacity+=DEFAULT_INC;
memset(ps->p_data+ps->sz,0,DEFAULT_INC*sizeof(DataType));
}
else
{
perror("CheckCapacity()::realloc");
exit(1);
}
}
}
void PushBack(pSeqList ps,DataType x)//尾部插入
{
assert(ps);
CheckCapacity(ps);
ps->p_data[ps->sz]=x;
ps->sz++;
}
void PopBack(pSeqList ps)
{
if(ps->sz==0)
{
return;
}
ps->sz--;
}
void PushFront(pSeqList ps,DataType x)//首部插入
{
int i=0;
assert(ps);
CheckCapacity(ps);
for(i=ps->sz;i>0;i--)
{
ps->p_data[i]=ps->p_data[i-1];
}
//memset(ps->p_data+1,ps->p_data,ps->sz*sizeof(DataType))
ps->p_data[0]=x;
ps->sz ++;
}
void PopFront(pSeqList ps)//头部删除
{
int i=0;
assert(ps);
if(ps->sz==0)
{
return;
}
for(i=0;i
sz;i++)
{
ps->p_data[i]=ps->p_data[i+1];
}
ps->sz--;
}
void Sort(pSeqList ps)//排序
{
int i=0;
int j=0;
assert(ps);
if((ps->sz)<2)
{
return;
}
for(i=0;i
sz-1;i++)
{
for(j=0;j
sz-1-i;j++)
{
if(ps->p_data[j]>ps->p_data[j+1])
{
DataType tmp=ps->p_data[j];
ps->p_data[j]=ps->p_data[j+1];
ps->p_data[j+1]=tmp;
}
}
}
}
int BinarySearch(pSeqList ps,int left,int right,DataType key)//对已排序的顺序表进行二分查找
{
assert(ps);
while(left<=right)
{
int mid=left+((right-left)>>1);
if(ps->p_data[mid]>key)
{
right=mid-1;
}
else if(ps->p_data[mid]
sz;i++)
{
if(ps->p_data[i]==x)
{
return i;
}
}
return -1;
}
void Insert(pSeqList ps,int pos,DataType x)//指定位置插入
{
int i=0;
assert(ps);
CheckCapacity(ps);
for(i=ps->sz;i>pos;i--)
{
ps->p_data[i]=ps->p_data[i-1];
}
ps->p_data[pos]=x;
ps->sz++;
}
void Erase(pSeqList ps,int pos)//指定位置删除
{
int i=0;
assert(ps);
if(ps->sz==0)
{
return;
}
if((pos<0)&&(pos>ps->sz))
{
printf("指定的位置有误!\n");
}
for(i=pos;i
sz;i++) { ps->p_data[i]=ps->p_data[i+1]; } ps->sz--; } void Remove(pSeqList ps,DataType x)//指定元素删除 { int pos=0; assert(ps); pos=Find(ps,x,0); if(pos==-1) { printf("指定元素不存在!\n"); } else { int i=0; for(i=pos;i
sz;i++) { ps->p_data[i]=ps->p_data[i+1]; } ps->sz--; } } void RemoveAll(pSeqList ps,DataType x)//指定所有元素删除 { int pos=0; int start=0; assert(ps); while(start
sz) { pos=Find(ps,x,start); if(pos==-1) { printf("指定元素不存在!\n"); return; } else { start=pos; pos=Find(ps,x,start); Erase(ps,pos); } } } void Reserve(pSeqList ps)//逆序 { int left=0; int right=ps->sz-1; assert(ps); while(left
p_data[left]; ps->p_data[left]=ps->p_data[right]; ps->p_data[right]=tmp; left++; right--; } } void Display(const pSeqList ps) { int i=0; assert(ps); if(ps->sz==0) { return; } for(i=0;i
sz;i++) { printf("%d ",ps->p_data[i]); } printf("\n"); } void Destory(pSeqList ps) { free(ps->p_data); ps->p_data=NULL; ps->capacity=0; ps->sz=0; }