C语言计算线性表的长度,c语言实现顺序结构的线性表,可自动增加长度的

最近闲来无事,就顺便把数据结构再复习一下,在此把我刚写的c语言实现的顺序结构线性表送给大家,不要吝啬评论哦。

#include "stdio.h"

#include "stdlib.h"

#include "io.h"

#include "math.h"

#include "time.h"

#define TRUE 1

#define FALSE 0

#define  MAXSIZE     100   // 线性表存储空间的初始分配量,

#define  INCREMENT    10     // 线性表存储空间的分配增量

//编码风格,所有变量单词第一个大写,函数的参数全部消协

typedef int ElemType;

typedef int Status;

//定义遍历函数

Status visit(ElemType &e)

{

printf("%d\n",e);

return TRUE;

}

typedef struct

{

ElemType *Data;

int Length;

int Size;

}ArrayList;

/* 初始化顺序线性表 */

Status InitList(ArrayList *arraylist)

{

arraylist->Data = (int *)malloc(MAXSIZE*(sizeof(ElemType)));

arraylist->Length = 0;

arraylist->Size = MAXSIZE;

return TRUE;

}

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */

Status ListEmpty(ArrayList *arraylist)

{

if(arraylist->Length = 0)

return TRUE;

return FALSE;

}

/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */

Status ListClear(ArrayList *arraylist)

{

arraylist->Length = 0;

return TRUE;

}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */

int ListLength(ArrayList *arraylist)

{

return arraylist->Length;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */

/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */

Status GetElem(ArrayList *arraylist,int pos,ElemType *e)

{

if(pos<1 || pos >arraylist->Length)

return FALSE;

*e = arraylist->Data[pos-1];

return TRUE;

}

/* 初始条件:顺序线性表L已存在 */

/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */

/* 若这样的数据元素不存在,则返回值为0 */

int LocateElem(ArrayList *arraylist,ElemType e)

{

if(ListEmpty(arraylist))

return FALSE;

int  i;

for(i=0;iLength;i++)

{

if(arraylist->Data[i] == e)

return i+1;

}

return FALSE;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */

/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */

Status ListInsert(ArrayList *arraylist,int pos,ElemType e)

{

if(pos<1 || pos >arraylist->Length+1)

return FALSE;

if(arraylist->Length==arraylist->Size)

{

arraylist->Data = (int *)realloc(arraylist->Data,(MAXSIZE+INCREMENT)*sizeof(ElemType));

if(arraylist->Data == NULL)

exit(OVERFLOW);

arraylist->Size += INCREMENT;

}

int i,j;

for(i=pos-1,j=arraylist->Length-1;i<=j;i++)

arraylist->Data[i+1] = arraylist->Data[i];

arraylist->Data[pos-1] = e;

arraylist->Length++;

return TRUE;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */

/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */

Status ListDelete(ArrayList *arraylist,int pos,ElemType *e)

{

if(pos < 1 || pos >arraylist->Length)

return FALSE;

*e = arraylist->Data[pos-1];

int i,j;

for(i=pos-1,j=arraylist->Length-1;i{

arraylist->Data[i] = arraylist->Data[i+1];

}

arraylist->Length-=1;

return TRUE;

}

/* 初始条件:顺序线性表L已存在 */

/* 操作结果:依次对L的每个数据元素输出 */

Status ListTraverse(ArrayList *arraylist)

{

int i;

for(i=0;iLength;i++)

visit(arraylist->Data[i]);

return TRUE;

}

/*初始条件:两个顺序结构实现的线性表*/

/*操作结果:将两个线性表求并放在另一个线性表中*/

Status unionArrayList(ArrayList *arraylist1,ArrayList *arraylist2,ArrayList *arraylist3)

{

int i,elem;

//求1和2并,放入3中

//先把1种的元素放入3

for(i=0;iLength;i++)

{

if(!LocateElem(arraylist3,arraylist1->Data[i]))

{

ListInsert(arraylist3,arraylist3->Length+1,arraylist1->Data[i]);

}

}

//再把2种的元素放入3

for(i=0;iLength;i++)

{

if(!LocateElem(arraylist3,arraylist2->Data[i]))

{

ListInsert(arraylist3,arraylist3->Length+1,arraylist2->Data[i]);

}

}

return TRUE;

}

/*初始条件:两个顺序结构实现的线性表*/

/*操作结果:求两个集合的交集*/

Status jiaoArrayList(ArrayList *arraylist1,ArrayList *arraylist2,ArrayList *arraylist3)

{

int i;

for(i=0;iLength;i++)

{

if(LocateElem(arraylist2,arraylist1->Data[i]))

{

ListInsert(arraylist3,arraylist3->Length+1,arraylist1->Data[i]);

}

}

return TRUE;

}

/*初始条件:两个顺序结构实现的线性表*/

/*操作结果:把这个集合arraylist1中相同的元素去掉放在2中*/

Status uniqueArrayList(ArrayList *arraylist1,ArrayList *arraylist2)

{

int i;

for(i=0;iLength;i++)

{

if(!LocateElem(arraylist2,arraylist1->Data[i]))

{

ListInsert(arraylist2,arraylist2->Length+1,arraylist1->Data[i]);

}

}

return TRUE;

}

/*已经存在两个线性表,是非递减排列*/

/*要求进行归并排序,12放入3,要求仍然是非递减排列*/

Status mergeArrayList(ArrayList *arraylist1,ArrayList *arraylist2,ArrayList *arraylist3)

{

InitList(arraylist3);

int len_1 = arraylist1->Length;

int len_2 = arraylist2->Length;

int i=0,j=0;

while(i{

if(arraylist1->Data[i]>arraylist2->Data[j])

{

ListInsert(arraylist3,arraylist3->Length+1,arraylist2->Data[j]);

j++;

}

else

{

ListInsert(arraylist3,arraylist3->Length+1,arraylist1->Data[j]);

i++;

}

}

while(i{

ListInsert(arraylist3,arraylist3->Length+1,arraylist1->Data[i]);

i++;

}

while(j{

ListInsert(arraylist3,arraylist3->Length+1,arraylist1->Data[j]);

j++;

}

return TRUE;

}

int main()

{

int a = 1;

ArrayList l1;

InitList(&l1);

ListInsert(&l1,1,a);

ListInsert(&l1,1,a);

ListTraverse(&l1);

return 0;

}

有什么问题的话,欢迎提问哈

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值