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

原创 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代码块中的函数实现。

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

相关文章推荐

顺序表的动态存储细节

顺序表的动态存储细节@(算法学习) 在顺序表的动态存储定义中需要包含的数据成员是(C) I. 数组指针 II. 表中元素个数n III. 表的大小maxSize IV. 数...

动态顺序表(可分配内存空间)

前几天写了一个静态顺序表,但是觉得一开始开辟很大一部分空间却不一定可以完全用得上,会造成很大的内存浪费,于是写了一个可以自动开辟内存空间的动态顺序表作为改进。 "DynamicSeqllist.h"...

内存动态分配函数malloc的基本实现原理

malloc是C语言最常用的标准库函数之一,用于在程序运行中动态地申请内存空间。我们都会使用它,其函数原型为: extern void *malloc(unsigned int num_bytes);...

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

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

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3….an)链式...
  • jxm_96
  • jxm_96
  • 2016年12月04日 22:31
  • 263

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) ...
  • xyang81
  • xyang81
  • 2014年05月16日 00:17
  • 2810

动态分区存储管理的模拟实现

  • 2017年11月16日 15:42
  • 982KB
  • 下载

C例子:队列(顺序存储方式)

  • 2015年07月25日 19:29
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模拟实现顺序表-动态的存储方式
举报原因:
原因补充:

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