动态实现顺序表



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

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

头文件

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

测试部分读者有兴趣可以自行添加测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值