线性数据结构--顺序表

 线性数据结构可分为:


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; } 
              
             
            
           
         
        
        
       
       
      
      
     
     







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值