您的位置:首页 > 编程语言 > C语言/C++

c语言构造简单的线性表

2015-11-15 18:21 393 查看
首先我们要明白线性表到底是个什么玩意,说白了很简单,就是有一段内存,我们得到该内存字段的首地址,并且知道该内存字段的长度;这样,一个线性表的雏形就有了,由于要对其进行操作,因此再加入一个指示标志,来指示内存空间的使用量;因此得到如下定义:

typedef int status;

typedef int ElemType;

typedef struct{

ElemType *elem;  //ElemType是自己指定的一种类型
int len;//内存空间已使用长度
int size;//内存空间的总长度

}Line;

下面进行一个简单的示范:

status LineInit(Line *L)  //Status也是自己定义的一种类型

{
(*L).elem = (ElemType *)malloc(initsize*sizeof(ElemType));
if((*L).elem==NULL)
exit (FALSE);
(*L).len=0;
(*L).size=initsize;
return OK;

}

使用时:

Line L;
LineInit(&L);  //初始化

为什么传指针?

解释:这是因为只有传指针才能使操作结果保留下来

为什么操作时使用(*L).elem而不是*L.elem?

解释:因为.的优先级比*的要高,所以要小括号

使用时为什么要传&参数?

解释:因为使用的是指针操作,因此要传递地址进入

下面附上可用的源代码,其中包含了入门的常用函数:

#include<stdio.h>

#include<stdlib.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR -1

#define initsize 4

#define addsize 2

typedef int status;

typedef int ElemType;

typedef struct //struct difine

{
ElemType *elem;
int len;
int size;

}Line;

status LineInit(Line *L)  //initial Line

{

(*L).elem = (ElemType *)malloc(initsize*sizeof(ElemType));
if((*L).elem==NULL)
exit (FALSE);
(*L).len=0;
(*L).size=initsize;
return OK;

}

status LineInsert(Line *L,int i,ElemType e)    //insert some number

{
ElemType *newbase;
ElemType *p;
int j;
if(i<1 || i>(*L).len+1)
return FALSE;
if((*L).len == (*L).size)//Line is full
{
newbase=(ElemType *)realloc((*L).elem,((*L).size+addsize)*sizeof(ElemType));
if(!newbase)
exit (FALSE);
(*L).elem=newbase;
(*L).size=(*L).size+addsize;
}
p=(*L).elem;
for(j=0;j<(*L).len-i+1;j++)
*(p+(*L).len-j)=*(p+(*L).len-j-1);
*((*L).elem+i-1)=e;
(*L).len++;
return OK;

}

status LineDelete(Line *L,int i,ElemType *e)

{
int j;
if(i<1 || i>(*L).len)
return FALSE;
*e=*((*L).elem+i-1);
for(j=0;j<(*L).len-i;j++)
*((*L).elem+i-1+j)=*((*L).elem+i+j);
(*L).len--;
return OK;

}

status LineDisplay(Line L)  //display all elem

{
int i;
for(i=0;i<L.len;i++)
{
printf("%5d",*(L.elem+i));
}
printf("\n");
return OK;

}

int LineLenth(Line L)   //return current number

{
return L.len;

}

status LineEmpty(Line *L)

{
(*L).len=0;
return OK;

}

status LineDestory(Line *L)

{
free((*L).elem);
(*L).elem=NULL;
(*L).len=0;
(*L).size=0;
return OK;

}

status ElemGet(Line L,int i,ElemType *e)

{
if(i<1 || i>L.len)
return FALSE;
*e=*(L.elem+i-1);
return OK;

}

int main()

{
Line L;
ElemType i,e;
LineInit(&L);  //初始化

for(i=0;i<initsize+5;i++)//插入一些测试数据
LineInsert(&L,1,i);
printf("current number is\n");
LineDisplay(L);//显示线性表的内容
LineDelete(&L,2,&e);//删除其中一个数据
printf("after delete No.2\n");
LineDisplay(L);//显示线性表的内容
ElemGet(L,3,&e);//获取其中一个数据
printf("ElemGet No.3 is %d\n",e);
LineInsert(&L,5,34);//再次插入测试数据
printf("after add No.5\n");
LineDisplay(L);
LineEmpty(&L);//清空线性表的内容
LineDestory(&L);//销毁这个线性表

return 0;

}

以上个人手打,难免疏漏,如有错误请多多包涵

8e5a
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 线性表