c语言_顺序表(可变数组,变长数组,VLA)

一、#include"顺序表.h"


#define Size  10

typedef struct Table
{
	int *head;//声明一个名为head的、长度不确定的数据
	int length;//记录当前顺序表的长度
	int size;//记录顺序表的分配的存储容量
}table;


table initTable();
int selectTable(table t, int elem);
table amendTable(table t, int elem, int newElem);
table addTable(table t, int elem, int add);
table deleteTable(table t, int add);
void displayTable(table t);

二、顺序表.cpp文件

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include"顺序表.h"


//顺序表的创建,顺序表的初始化
table initTable(){
	table tableArry;
	tableArry.head =(int*)malloc(Size*sizeof(int));
	if (!tableArry.head)
	{
		printf("初始化失败");
		exit(0);
	}
	tableArry.length = 0;
	tableArry.size = Size;
	return tableArry;
}

//顺序表的查找元素,其中elem表示要查找的数据元素的值
int selectTable(table t,int elem){
	for (int i = 0; i < t.length; i++)
	{
		if (t.head[i] == elem)
		{
			return i+1;
		}
	}
	return -1;
}


//顺序表中更改元素
table amendTable(table t, int elem, int newElem){
	int add = selectTable(t, elem);
	t.head[add-1] = newElem;
	return t;

}

//顺序表插入元素
table addTable(table t, int elem, int add){
	//判断插入位置是否存在问题,如果比表大
	if (add > t.length+1 || add < 1)
	{
		printf("插入位置有问题");
	}
	//插入时,判断存储空间
	if (t.length == t.size)
	{
		t.size += 1;
		t.head = (int*)realloc(t.head, t.size *sizeof(int));
		if (!t.head)
		{
			printf("存储分配失败");
			return t;
		}
	}

	//插入操作,需要将从插入位置开始的后续元素,逐个后移
	for (int i = t.length - 1; i >= add - 1; i--)
	{
		t.head[i + 1] = t.head[i];
	}
	//后移后,直接插入元素
	t.head[add - 1] = elem;
	t.length++;
	return t;
}


//顺序表的删除
table deleteTable(table t, int add){
	if (add > t.length || add < 1)
	{
		printf("被删除位置有误");
		exit(0);
	}
	//删除操作
	for (int i = add; i < t.length; i++)
	{
		t.head[i-1] = t.head[i];

	}

	t.length--;
	return t;
}

void displayTable(table t){
	for (int i = 0; i < t.length; i++)
	{
		printf("%d ", t.head[i]);
	}
	printf("\n");
}

三、测试程序

// 顺序表.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"顺序表.h"

int _tmain(int argc, _TCHAR* argv[])
{
	table t1 = initTable();
	for (int i = 1; i <= Size; i++) {
		t1.head[i - 1] = i;
		t1.length++;
	}
	printf("原顺序表:\n");
	displayTable(t1);


	printf("删除元素5:\n");
	t1 = deleteTable(t1, 5);
	displayTable(t1);

	printf("在第2的位置插入元素5:\n");
	t1 = addTable(t1, 5, 2);
	displayTable(t1);

	printf("在第2的位置插入元素5:\n");
	t1 = addTable(t1, 5, 2);
	displayTable(t1);

	t1 = addTable(t1, 5, 2);
	displayTable(t1);

	printf("查找元素3的位置:\n");
	int add = selectTable(t1, 3);
	printf("%d\n", add);

	printf("将元素3改为6:\n");
	t1 = amendTable(t1, 3, 6);
	displayTable(t1);
	return 0;
}

四、可变数组(可以和前面融合,以后再整理)

// 数据处理.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"stdlib.h"
#include"stdio.h"

char *arry;
int size;


void initArry()
{
	arry = (char *)malloc( sizeof(char) );
	size = sizeof(char);
}

void addInEnd(int elem)
{
	arry = (char *)realloc(arry ,size + sizeof(char));
	size = size + sizeof(char);
	arry[size - 1] = elem;
}

void insert(int index, char elem)
{
	if (index > size)
	{
		exit(-1);
	}

	arry = (char *)realloc(arry, size + sizeof(char));
	size = size + 1;

	for (int i = size - 1; i <= index; i--)
	{
		arry[i] = arry[i - 1];
	}
	arry[index] = elem;
}

void delete_t()
{
	arry = (char *)realloc(arry, size - sizeof(char));
	size = size - sizeof(char);
}

void delete_anyPosition(int index)
{
	if (index > size - 1)
	{
		exit(-1);
	}

	for (int i = index; i < size-1; i++)
	{
		arry[i] = arry[i + 1];
	}
	arry = (char *)realloc(arry, size - sizeof(char));
	size = size - sizeof(char);
	


}

void modify(int index,char elem)
{
	if (index > size - 1)
	{
		exit(-1);
	}

	arry[index] = elem;
}



char print(int index)
{
	printf("%c", arry[index]);
	return arry[index];
}


int _tmain(int argc, _TCHAR* argv[])
{
	
	return 0;
}

五、变长数组(VLA)

前面构建的顺序表,功能比变长数组(VLA),可以在运行中继续添加存储空间,而变长数组仅仅是在运行时决定分配数据的大小,而以往的数组要求数组的大小在编译时就是明确的,因此变长数组仅仅是在运行时确定数组的大小。

参考链接:

c语言:http://c.biancheng.net/view/vip_1837.html

c++实现VLA类 :http://c.biancheng.net/view/2224.html

你可能感兴趣的:(数据结构,c/c++,c语言,数据结构,可变数组,顺序表)