顺序表的生成--申请内存

我们要使用一个类似于数组这样的连续的内存在C语言中必须要预先定义,并且这个表是不能够增加长度的,这难免有些不便,在将来要维护这张表带来了很多麻烦。怎么解决这个麻烦呢?我们可以做这样一件事,动态数组!C++中可以使用vector向量来实现,Java可以用array对象数组实现,C语言的话则可以用到realloc实现!

要求:

实现顺序表的各种基本运算

1 实验目的

实现顺序表的各种基本运算。

 

实验内容

实现顺序表的各种基本运算,在此基础上设计一个主程序完成以下功能:

(1) 初始化顺序表L

(2) 依次向顺序表尾部插入学号分解后的数字字符,学号为20161100向顺序表插入的字符为:’2’’0’‘1’6‘1’‘1’‘0’‘0’

(3) 依次输出顺序表L的元素

(4) 输出顺序表L的长度

(5) 输出顺序表L的第2个元素

(6) 找到第一个元素为’6’的位置

(7) 在第4个元素位置上插入f元素

(8) 依次输出顺序表L的元素

(9) 删除L的第3个元素

(10) 依次输出顺序表L的元素

(11) 释放顺序表L


具体代码如下:

#include<stdio.h>
#include<stdlib.h>

//******宏定义参数内容******
#define DATA_SIZE 200
#define EXTEND_DATA_SIZE 50
#define NO 0
#define OK 1
#define ERROR -1

//******基本数据类型别名******
typedef int Status;
typedef char Excelelem;
typedef int Numelem;

//******顺序表数据结构******
typedef struct
{
	Excelelem *book;
	Numelem Lenght;
	Numelem Listsize;
}Liststruct;

//******初始化顺序表******
Liststruct* init()
{
	Liststruct* Head;
	Head=(Liststruct *)malloc(sizeof(Liststruct));
	Head->book=(Excelelem *)malloc(DATA_SIZE*sizeof(Excelelem));
	if(Head==NULL)
		printf("内存申请失败!\n");
	else
	{
		Head->Listsize=DATA_SIZE;
		Head->Lenght=0;
	}
	return Head;
}

/******拓展顺序表******/
Status Extend(Liststruct *Head)
{
	Liststruct *p;
	int size=Head->Listsize;
	p=(Liststruct *)realloc(Head,EXTEND_DATA_SIZE*sizeof(Excelelem));
	if(p==NULL)
	{
		printf("动态内存申请失败!\n");
		return NO;
	}
	else
	{
		Head=p;
		Head->Listsize=size+EXTEND_DATA_SIZE;
	}
	return OK;
}

/******压入数据******/
void DATA_cin(Liststruct *Head)
{
	Excelelem ch;
	Numelem Length=0;
	while((ch=getchar())!='\n')
	{
		if(Head->Listsize<Length)
		{
			if(!Extend(Head))  //内存申请失败数据读入截止
				break;
		}
		Head->book[Length++]=ch;
	}
	Head->Lenght=Length;
	return ;
}

/******打印表中数据内容******/
void DATA_cout(Liststruct *Head)
{
	int i;
	for(i=0;i<Head->Lenght;i++)
		printf("%c",Head->book[i]);
	printf("\n");
	return ;
}
 /******打印表中local位置元素内容******/
void Local(Liststruct* Head,int local)
{
	if(Head->Lenght<local && local<1)
	{
		printf("警告!不存在%d位置的元素\n",local);
		return ;
	}
	printf("%c\n",Head->book[local-1]);
	return ;
}

/******找到表中出现的字符ch的首位置******/
Status DATA_find(Liststruct* Head,char ch)
{
	int i;
	for(i=0;i<Head->Lenght;i++)
		if(ch==Head->book[i])
			break;
	if(i==Head->Lenght)
	{
		printf("未能找到您想要元素的位置!\n");
		return NO;
	}
	return i+1;
}

/******在第k个元素前插入一个元素******/
void DATA_Insert(Liststruct *Head,int k,Excelelem ch)
{
	if(Head->Lenght<k && k<1)
	{
		printf("警告!不存在%d位置的元素\n",k);
		return ;
	}
	int i;
	for(i=Head->Lenght;i>=k;i--)
		Head->book[i]=Head->book[i-1];
	Head->book[k-1]=ch;
	Head->Lenght++;
	return ;
}

/******删除第k个元素******/
void DATA_Delete(Liststruct *Head,int k)
{
	if(Head->Lenght<k && k<1)
	{
		printf("警告!不存在%d位置的元素\n",k);
		return ;
	}
	int i;
	for(i=k-1;i<Head->Lenght-1;i++)
		Head->book[i]=Head->book[i+1];
	Head->Lenght--;
	return ;
}

int main()
{
	Liststruct *Head;
	Numelem i;
	Excelelem ch;
	puts("");
	puts("******等待顺序表Head初始化!******");
	Head=init();
	puts("******顺序表Head初始化完成!******");
	printf("请输入顺序表Head的内容:\n");
	DATA_cin(Head);
	printf("顺序表中的内容为:\n");
	DATA_cout(Head);
	printf("顺序表Head的长度为:\n");
	printf("%d\n",Head->Lenght);
	printf("顺序表第%d个元素是:\n",i=2);
	Local(Head,i);
	printf("顺序表中出现%c元素的第一个位置在:\n",ch='6');
	i=DATA_find(Head,ch);
	if(i) printf("%d\n",i);
	printf("请在第%d个元素之前插上%c\n",i=4,ch='f');
	DATA_Insert(Head,i,ch);
	printf("顺序表中的内容为:\n");
	DATA_cout(Head);
	printf("请将顺序表中第%d个元素删除\n",i=3);
	DATA_Delete(Head,i);
	printf("顺序表中的内容为:\n");
	DATA_cout(Head);
	puts("******顺序表Head使用完毕!******\n");
	free(Head->book);
	free(Head);
	return 0;
}

总结:

计算机的内存机制非常深奥有趣,真正掌握数据结构这门课还有很长的路要走,还有很多知识点要学,潜下心来把这些基础学好学扎实才是首要任务!C语言是许多面向对象语言的“母语”,目前还只是触碰到冰山一角,如果想学得更踏实,还得更深刻地理解C语言才行!