数据结构之顺序表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xnh_565175944/article/details/79945106

顺序表:

       线性表的顺序存储结构是指将线性表的所有数据元素,按逻辑顺序依次存储在一组连续的内存单元中,用这种存储形式存储的线性表称为顺序表。(逻辑顺序与物理存放的顺序相同)

 

顺序表的特点:

(1).逻辑关系相邻的两个数据元素在物理位置上也相邻

(2).顺序表中的的数据元素的数据类型相同,所占用的存储空间也相同

 

顺序表的优点:

       存取速度高效(因为是通过数组,所以可以直接访问下标来存取)

 

顺序表的缺点:

       插入和删除比较缓慢(当插入一个数的时候需要挪动这个位置后面全部的数给这个数腾出位置,删除类似)

       不可以增加顺序表的长度(当顺序表创建成功之后,便不可以对数组的长度进行改变)

 

顺序表结构

typedef struct
{
	int *elem;
	int length;		//现在长度 
	int size;		//容量 
}SeqList;

 

顺序表初始化

SeqList* SeqList_Init()            //顺序表初始化 
{
	SeqList* list;
	list = (SeqList*)malloc(sizeof(SeqList));
	list->elem = (int *)malloc(sizeof(int)*init_size);
	list->size = init_size;
	list->length = 0;
	return list;
}

 

创建顺序表

void SeqList_build(SeqList* list)		//创建顺序表 
{
	int data;
	cout << "请输入您要输入顺序表的元素:";
	while(cin >> data && data != -1)
	{
		if(list->length < list->size)
		{
			list->elem[list->length++] = data;
		}
		else
		{
			list->elem = (int *)realloc(list->elem,(list->size + init_size) * sizeof(int));
			list->elem[list->length++] = data;
			list->size = list->size + init_size;
		}
	}
}

 

顺序表插入元素

void SeqList_Insert(SeqList* list,int index,int date)		//往特定位置插入数据 
{
	
	if(list->length==list->size)
		list->elem = (int*)realloc(list->elem,sizeof(int)*(list->size+init_size));
	for(int i = list->length; i >= index; i--)
	{
		list->elem[i+1] = list->elem[i];
	}
	list->elem[index] = date;
	list->length++;
}

 

顺序表合并

SeqList* SeqList_merge(SeqList* list1,SeqList* list2)		//合并顺序表 
{
	SeqList* list3;
	list3 = (SeqList*)malloc(sizeof(SeqList));
	list3->elem = (int*)malloc(sizeof(int)*(list1->size + list2->size));
	list3->size = list1->size + list2->size;
	list3->length = 0;
	while(list3->length < list1->length)
	{
		list3->elem[list3->length] = list1->elem[list3->length++];
	}
	while(list3->length - list1->length < list2->length)
	{
		list3->elem[list3->length] = list2->elem[list3->length - list1->length];
		list3->length++;
	}
	
	return list3;
}

打印顺序表

void SeqList_print(SeqList* list)		//打印顺序表 
{
	int i = 0;
	while(i < list->length )	cout << list->elem[i++] << ends;

	cout << endl;
}

释放顺序表内存

void SeqList_free(SeqList* list)		//释放顺序表 
{
	list->size = 0;
	list->length = 0;
	free(list->elem);
	free(list);
}

 

 

 

测试代码:

#include <iostream>
#include <stdlib.h>
#include <malloc.h>
using namespace std;

const int init_size = 5;

typedef struct
{
	int *elem;
	int length;		//现在长度 
	int size;		//容量 
}SeqList;

SeqList* SeqList_Init()            //顺序表初始化 
{
	SeqList* list;
	list = (SeqList*)malloc(sizeof(SeqList));
	list->elem = (int *)malloc(sizeof(int)*init_size);
	list->size = init_size;
	list->length = 0;
	return list;
}

void SeqList_build(SeqList* list)		//创建顺序表 
{
	int data;
	cout << "请输入您要输入顺序表的元素:";
	while(cin >> data && data != -1)
	{
		if(list->length < list->size)
		{
			list->elem[list->length++] = data;
		}
		else
		{
			list->elem = (int *)realloc(list->elem,(list->size + init_size) * sizeof(int));
			list->elem[list->length++] = data;
			list->size = list->size + init_size;
		}
	}
}

void SeqList_Insert(SeqList* list,int index,int date)		//往特定位置插入数据 
{
	
	if(list->length==list->size)
		list->elem = (int*)realloc(list->elem,sizeof(int)*(list->size+init_size));
	for(int i = list->length; i >= index; i--)
	{
		list->elem[i+1] = list->elem[i];
	}
	list->elem[index] = date;
	list->length++;
}

SeqList* SeqList_merge(SeqList* list1,SeqList* list2)		//合并顺序表 
{
	SeqList* list3;
	list3 = (SeqList*)malloc(sizeof(SeqList));
	list3->elem = (int*)malloc(sizeof(int)*(list1->size + list2->size));
	list3->size = list1->size + list2->size;
	list3->length = 0;
	while(list3->length < list1->length)
	{
		list3->elem[list3->length] = list1->elem[list3->length++];
	}
	while(list3->length - list1->length < list2->length)
	{
		list3->elem[list3->length] = list2->elem[list3->length - list1->length];
		list3->length++;
	}
	
	return list3;
}

void SeqList_print(SeqList* list)		//打印顺序表 
{
	int i = 0;
	while(i < list->length )	cout << list->elem[i++] << ends;

	cout << endl;
}

void SeqList_free(SeqList* list)		//释放顺序表 
{
	list->size = 0;
	list->length = 0;
	free(list->elem);
	free(list);
}

int main()
{
	SeqList* list1;
	SeqList* list2;
	SeqList* list3;
	
	list1 = SeqList_Init();			//初始化顺序表1大小 
	SeqList_build(list1);		//创建顺序表1 
	//SeqList_Insert(list1,3,100); 
	SeqList_print(list1);		//打印顺序表1
	
	list2 = SeqList_Init();		//初始化顺序表2
	SeqList_build(list2);		//创建顺序表2
	SeqList_print(list2);
	
	cout << "合并后SeqList:"; 
	list3 = SeqList_merge(list1,list2);
	SeqList_print(list3);
	
	
	
	SeqList_free(list1);			//释放顺序表1内存 
	SeqList_free(list2);			//释放顺序表2内存 
	SeqList_free(list3);			//释放顺序表3内存 
	return 0;
}

 

 

测试结果

 

 

 

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭