顺序表的生成--申请内存
我们要使用一个类似于数组这样的连续的内存在C语言中必须要预先定义,并且这个表是不能够增加长度的,这难免有些不便,在将来要维护这张表带来了很多麻烦。怎么解决这个麻烦呢?我们可以做这样一件事,动态数组!C++中可以使用vector向量来实现,Java可以用array对象数组实现,C语言的话则可以用到realloc实现!
要求:
实现顺序表的各种基本运算
1 实验目的
实现顺序表的各种基本运算。
2 实验内容
实现顺序表的各种基本运算,并在此基础上设计一个主程序完成以下功能:
(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语言才行!