模拟实现顺序表-动态的存储方式

原创 2016年06月01日 21:56:01

         模拟实现顺序表-静态的方式

        

http://blog.csdn.net/qq_34328833/article/details/51494234
        我们知道静态的存储方式中数组Data的大小是固定的是100,也就是说我们最多只能存储100组信息数据,当要增加信息数据时我们就需要扩大数组Data的大小,是不是很麻烦呢?这就要提出我们今天要实现的版本 -动态的存储方式.
        首先我们先来看顺序表的结构成员,实现代码如下:
        
typedef int DataType;  

typedef struct SeqList  
{  
    DataType *Data;  
    int size;  
	int capacity;   //容量
}SeqList,*pSeqList; 
        我们先给出程序的测试代码:
        
#include"SeqList_dyna.h"

void text()
{
	int x=0;  
    int input=1;  
    int pos=0;  
	int ret=0;
    SeqList pSeq;  
    Init_SeqList(&pSeq);  
    while(input)  
    {  
        menu();  
        printf("请选择一个你要进行的操作:");  
        scanf("%d",&input);  
        switch(input)  
        {  
        case 1:  
            printf("请输入一个你要插入的数据:");  
            scanf("%d",&x);  
            Push_Back(&pSeq,x);  
            break;  
        case 2:  
             Pop_Back(&pSeq);  
             break;  
        case 3:  
            printf("请输入一个你要插入的数据:");  
            scanf("%d",&x);  
            Push_front(&pSeq,x);  
            break;  
        case 4:  
            Pop_front(&pSeq);  
            break;  
        case 5:  
            printf("请输入一个你要插入的数据:");  
            scanf("%d",&x);  
            printf("请输入你要插入的位置:");  
            scanf("%d",&pos);  
            Insert_SeqList(&pSeq,pos,x);  
            break;  
        case 6:  
            printf("请输入一个你要删除的数据:");  
            scanf("%d",&x);  
            Remove_SeqList(&pSeq,x);  
            break;  
        case 7:  
            printf("请输入一个你要删除的数据:");  
            scanf("%d",&x);  
            RemoveAll_SeqList(&pSeq,x);  
            break;  
        case 8:  
            Bubble_Sort(&pSeq);  
            break;  
        case 9: 
			Insertion_Sort(&pSeq);
            break;  
        case 10:  
			Select_Sort(&pSeq);
			break;
		case 11:
			Print_SeqList(&pSeq); 
			break;
		case 12:
			printf("请输入一个你要查找的数据:");  
            scanf("%d",&x);  
            ret=Binary_Search(&pSeq,x);  
			if(pSeq.Data[ret] == x)
			{
				printf("查找成功\n");
			}
			else
			{
				printf("查找失败\n");
			}
			break;
        case 0: 
			Free_SeqList(&pSeq);
            break;  
        default:  
            printf("您的输入错误请重新选择\n");  
            break;  
        }  
    }  
}

int main()  
{  
	text();
    system("pause");  
    return 0;  
} 
         
        既然要动态增加 存储信息的个数,malloc当然少不了啦!malloc用于给指针Data分配初始空间当顺序表长度增加到和顺序表的容量一致时,此时就需要realloc进行扩容工作了,当添加信息时就需要判断是否需要增加扩容了;分配空间和扩容的代码实现如下:
        分配空间:
         
void Init_SeqList(pSeqList pSeq)  
{  
    //pSeq->size=0;  
    //memset(pSeq->Data,0,MAX*sizeof(DataType));  
	pSeq->Data=(DataType *)malloc(sizeof(DataType)*MAX_INIT);
	if(NULL == pSeq->Data)
	{
		printf("out of memory\n");
		exit(EXIT_FAILURE);
	}
	pSeq->size=0;
	pSeq->capacity=MAX_INIT;
}  
        扩容:
        
void Judge_Full(pSeqList pSeq)    //判断容量是否满了
{
	if(pSeq->capacity == pSeq->size)
	{
		DataType *tmp=(DataType *)realloc(pSeq->Data,(pSeq->capacity+MAX_ADD)*sizeof(DataType));
		if(NULL == pSeq->Data)
		{
			printf("out of memory\n");
			exit(EXIT_FAILURE);
		}
		else
		{
			pSeq->Data=tmp;
			pSeq->capacity+=MAX_ADD;
		}
	}
}
        
        SeqList_dyna.h
        
#define _CRT_SECURE_NO_WARNINGS  
#ifndef __SEQLIST_D_H__    //防止重复引入
#define __SEQLIST_D_H__
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<assert.h>  

#define MAX 100  
#define MAX_INIT 3
#define MAX_ADD 3
typedef int DataType;  

typedef struct SeqList  
{  
    DataType *Data;  
    int size;  
	int capacity;   //容量
}SeqList,*pSeqList;  

void menu();
void Print_SeqList(pSeqList pSeq);         //打印输出  
void Init_SeqList(pSeqList pSeq);          //初始化  
void Judge_Full(pSeqList pSeq);            //判断容量是否满了
void Free_SeqList(pSeqList pSeq);          //释放空间
void Push_Back(pSeqList pSeq,DataType x);  //尾插  
void Pop_Back(pSeqList pSeq);              //尾删  
void Push_front(pSeqList pSeq,DataType x); //头插  
void Pop_front(pSeqList pSeq);             //头删  
void Insert_SeqList(pSeqList pSeq,int pos,DataType x); //在顺序表的指定位置插入指定的元素  
void Remove_SeqList(pSeqList pSeq,DataType x);       //删除特定的元素  
void RemoveAll_SeqList(pSeqList pSeq,DataType x);    //删除全部的特定元素  
void Bubble_Sort(pSeqList pSeq);            //冒泡排序 
void Insertion_Sort(pSeqList pSeq);         //直接插入排序 
void Select_Sort(pSeqList pSeq);            //选择排序
int Find_NUM(pSeqList pSeq ,DataType x);               
int Binary_Search(pSeqList pSeq,DataType x);          


#endif //__SEQLIST_D_H__  
         SeqList_dyna.c
         
#include"SeqList_dyna.h"

void menu()  
{  
    printf("***********************************************\n");  
    printf("*****0.exit**1.Push_Back**2.Pop_Back***********\n");  
    printf("*****3.Push_front*********4.Pop_front**********\n");  
    printf("*****5.Insert_SeqList*****6.Remove_SeqList*****\n");  
    printf("*****7.RemoveAll_SeqList**8.Bubble_Sort********\n");  
	printf("*****9.Insertion_Sort*****10.Select_Sort*******\n"); 
    printf("****11.Print_SeqList******12.Binary_Search*****\n");  
    printf("***********************************************\n");  
} 

void  Print_SeqList(pSeqList pSeq)  
{  
    int i=0;  
    assert(pSeq);  
    for(i=0;i<pSeq->size;i++)  
    {  
        printf("%d ",pSeq->Data[i]);  
    }  
    printf("\n");  
}  
  
void Init_SeqList(pSeqList pSeq)  
{  
    //pSeq->size=0;  
    //memset(pSeq->Data,0,MAX*sizeof(DataType));  
	pSeq->Data=(DataType *)malloc(sizeof(DataType)*MAX_INIT);
	if(NULL == pSeq->Data)
	{
		printf("out of memory\n");
		exit(EXIT_FAILURE);
	}
	pSeq->size=0;
	pSeq->capacity=MAX_INIT;
}  

void Judge_Full(pSeqList pSeq)    //判断容量是否满了
{
	if(pSeq->capacity == pSeq->size)
	{
		DataType *tmp=(DataType *)realloc(pSeq->Data,(pSeq->capacity+MAX_ADD)*sizeof(DataType));
		if(NULL == pSeq->Data)
		{
			printf("out of memory\n");
			exit(EXIT_FAILURE);
		}
		else
		{
			pSeq->Data=tmp;
			pSeq->capacity+=MAX_ADD;
		}
	}
}

void Push_Back(pSeqList pSeq,DataType x)    
{  
    assert(pSeq);   
	Judge_Full(pSeq);
    pSeq->Data[pSeq->size]=x;  
    pSeq->size++;  
}  
  
void Pop_Back(pSeqList pSeq)  
{  
    assert(pSeq);  
    if(pSeq->size == 0)  
    {  
        printf("顺序表已空\n");  
        return ;  
    }  
    pSeq->size--;   
}  
  
void Push_front(pSeqList pSeq,DataType x)  //在顺序表的前面添加元素  
{  
    int i=0;  
    assert(pSeq);  
	Judge_Full(pSeq);
    for(i=pSeq->size-1;i>=0;i--)  
    {  
        pSeq->Data[i+1]=pSeq->Data[i];  
    }  
    pSeq->Data[0]=x;  
    pSeq->size++;  
}  
  
void Pop_front(pSeqList pSeq)  
{  
    int i=0;  
    assert(pSeq);  
    for(i=0;i<pSeq->size;i++)  
    {  
        pSeq->Data[i]=pSeq->Data[i+1];  
    }  
    pSeq->size--;  
}  
  
void Insert_SeqList(pSeqList pSeq,int pos,DataType x)  //在指定指定位置插入元素x,pos是下标  
{  
    int i=0;  
    assert(pSeq);  
	Judge_Full(pSeq);
    for(i=pSeq->size-1;i>=pos;i--)  
    {  
        pSeq->Data[i+1]=pSeq->Data[i];  
    }  
    pSeq->Data[pos]=x;  
    pSeq->size++;  
}  
  
void Remove_SeqList(pSeqList pSeq,DataType x)   //删除指定元素  
{  
    int i=0;  
    int ret=0;  
    ret= Find_NUM(pSeq,x);  
    assert(pSeq);  
    if(ret == -1)  
    {  
        printf("顺序表中没有此元素\n");  
        return ;  
    }  
    else  
    {  
        for(i=ret;i<pSeq->size;i++)  
        {  
            pSeq->Data[i]=pSeq->Data[i+1];  
        }  
    }  
    pSeq->size--;  
    printf("删除成功\n");  
}  
  
int Find_NUM(pSeqList pSeq ,DataType x)            //查找函数  
{  
    int i=0;  
    for(i=0;i<pSeq->size;i++)  
    {  
        if(pSeq->Data[i] == x)  
            return i;  
    }  
    return -1;  
}  
  
void RemoveAll_SeqList(pSeqList pSeq,DataType x)  //删除所有指定元素  
{  
    int i=0;  
    int j=0;  
    int ret=0;  
    assert(pSeq);  
    while(ret < pSeq->size)  
    {  
        ret=Find_NUM(pSeq,x);  
        if(ret == -1)  
        {     
            printf("顺序表中没有此元素\n");  
            return ;  
        }  
        else  
        {  
            for(i=ret;i<pSeq->size;i++)  
            {  
                pSeq->Data[i]=pSeq->Data[i+1];  
            }  
        }  
        pSeq->size--;  
        ret++;  
    }  
    printf("删除成功\n");  
}  
  
void Bubble_Sort(pSeqList pSeq)   //冒泡排序  
{  
    int i=0;  
    int j=0; 
	int m=0;
    DataType tmp=0;  
    int flag=0;
	int k=pSeq->size-1;
    assert(pSeq);  
    for(i=0;i<pSeq->size-1;i++)  
    {  
		m=0;
        flag=0;                                 //对冒泡排序的优化  
        for(j=0;j<k;j++)      //每次都从最后一次交换的位置继续执行
        {  
            if(pSeq->Data[j] > pSeq->Data[j+1])  //默认升序排列  
            {  
                tmp=pSeq->Data[j];  
                pSeq->Data[j]=pSeq->Data[j+1];  
                pSeq->Data[j+1]=tmp;  
                flag=1;  
				m=j;       //用来记录最后一次交换的位置
            }  
        }  
        if(flag == 0)  
            break; 
		k=m;      //将k置成最后一次交换的位置
    }  
}  

void Insertion_Sort(pSeqList pSeq)         //直接插入排序 
{
	int i=0;
	int j=0;
	int k=0;
	DataType tmp=0;
	for(i=1;i<pSeq->size;i++)   //选取第一个元素为有序的将其他数字插入它的两边
	{
		tmp=pSeq->Data[i];
		for(j=i-1;j>=0;j--)
		{
			if(pSeq->Data[i] >= pSeq->Data[j])   //升序排列
			{
				break;
			}
		}
		for(k=i-1;k>j;k--)   //移位,空出位置插入tmp,也可以交换
		{
			pSeq->Data[k+1]=pSeq->Data[k];
		}
		pSeq->Data[j+1]=tmp;
	}
}

void Select_Sort(pSeqList pSeq)            //选择排序,升序排列
{
	int i=0;
	int j=0;
	int min=0;
	for(i=0;i<pSeq->size-1;i++)
	{
		min=i;
		for(j=i+1;j<pSeq->size;j++)
		{
			if(pSeq->Data[j] < pSeq->Data[min])   //找到i后面所有数据的最小值
			{
				min=j;
			}
		}
		if(i != min)    //找到的最小值的下标和初始的i值不同,交换
		{
			DataType tmp=pSeq->Data[i];
			pSeq->Data[i]=pSeq->Data[min];
			pSeq->Data[min]=tmp;
		}
	}
}

int Binary_Search(pSeqList pSeq,DataType x)  
{  
    int left=0;  
    int mid=0;  
    int right=pSeq->size-1;  
    assert(pSeq);  
    Bubble_Sort(pSeq);     //二分查找必须是有顺序的一组元素  
    while(left < right)  
    {  
        mid=(left+right)/2;  
        if(pSeq->Data[mid] < x)  
        {  
            left=mid;  
        }  
        else if(pSeq->Data[mid] > x)  
        {  
            right=mid;  
        }  
        else  
        {  
            return mid;  
        }  
    }  
    return -1;  
}  

void Free_SeqList(pSeqList pSeq)
{
	free(pSeq->Data);
	pSeq->Data=NULL;
	exit(0);
}

          text.c
          
#include"SeqList_dyna.h"

void text()
{
	int x=0;  
    int input=1;  
    int pos=0;  
	int ret=0;
    SeqList pSeq;  
    Init_SeqList(&pSeq);  
    while(input)  
    {  
        menu();  
        printf("请选择一个你要进行的操作:");  
        scanf("%d",&input);  
        switch(input)  
        {  
        case 1:  
            printf("请输入一个你要插入的数据:");  
            scanf("%d",&x);  
            Push_Back(&pSeq,x);  
            break;  
        case 2:  
             Pop_Back(&pSeq);  
             break;  
        case 3:  
            printf("请输入一个你要插入的数据:");  
            scanf("%d",&x);  
            Push_front(&pSeq,x);  
            break;  
        case 4:  
            Pop_front(&pSeq);  
            break;  
        case 5:  
            printf("请输入一个你要插入的数据:");  
            scanf("%d",&x);  
            printf("请输入你要插入的位置:");  
            scanf("%d",&pos);  
            Insert_SeqList(&pSeq,pos,x);  
            break;  
        case 6:  
            printf("请输入一个你要删除的数据:");  
            scanf("%d",&x);  
            Remove_SeqList(&pSeq,x);  
            break;  
        case 7:  
            printf("请输入一个你要删除的数据:");  
            scanf("%d",&x);  
            RemoveAll_SeqList(&pSeq,x);  
            break;  
        case 8:  
            Bubble_Sort(&pSeq);  
            break;  
        case 9: 
			Insertion_Sort(&pSeq);
            break;  
        case 10:  
			Select_Sort(&pSeq);
			break;
		case 11:
			Print_SeqList(&pSeq); 
			break;
		case 12:
			printf("请输入一个你要查找的数据:");  
            scanf("%d",&x);  
            ret=Binary_Search(&pSeq,x);  
			if(pSeq.Data[ret] == x)
			{
				printf("查找成功\n");
			}
			else
			{
				printf("查找失败\n");
			}
			break;
        case 0: 
			Free_SeqList(&pSeq);
            break;  
        default:  
            printf("您的输入错误请重新选择\n");  
            break;  
        }  
    }  
}

int main()  
{  
	text();
    system("pause");  
    return 0;  
} 

            在程序的实现过程中排序使用了三种方法:冒泡排序,直接插入排序和选择排序,实现可参见上述SeqList_dyna代码块中的函数实现。

版权声明:一起来探索代码的世界 举报

相关文章推荐

动态顺序表(可扩容)的基本操作

头文件:#define _CRT_SECURE_NO_WARNINGS 1 #ifndef _STATICSEQLIST_H__ #define _STATICSEQLIST_H__#include ...

模拟实现顺序表-动态的存储方式

模拟实现顺序表-静态的方式          http://blog.csdn.net/qq_34328833/article/details/51494234         我们知道静态的存...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

模拟实现线性表-顺序存储方式

永远不要否定自己,因为你不知道自己会有多大的潜力。

动态顺序表

一、动态顺序表:        动态顺序表也是顺序表,不过它是动态的,也就是说它的容量是可以改变的,这就克服了静态顺序表容量不能改变的缺点。当顺序表的容量存满以后,我们可以对它进行扩容,概念就简单介绍...

顺序表的动态内存实现

线性表的顺序存储结构就是,把线性表中的所有元素按照其逻辑顺序依次存储在计算机存储器中指定存储位置开始的一块连续的存储空间中。因此,线性表的顺序存储结构是利用数组来实现的,数组的基本类型就是线性表中元素...

C模拟实现静态顺序表

头文件模块: #include typedef int DATATYPE; const int MAX = 5; struct SeqList { DATATYPE data[MAX...

C++模拟实现静态顺序表

#define _CRT_SECURE_NO_WARNINGS #include #include #include #include using namespace std; const int M...

模拟实现顺序表

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

栈的动态顺序存储表示

采用动态一维数组来存储栈。所谓动态,指的是栈的大小可以根据需要增加。 ◆ 用bottom表示栈底指针,栈底固定不变的;栈顶则随着进栈和退栈操作而变化。用top(称为栈顶指针)指示当前栈顶位置。 ◆...

线性表的顺序储存结构定义(动态)实现

线性表的顺序储存结构定义(动态)实现
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)