线性表的创建,添加,修改,清空,销毁,获得元素位置,前驱,后继--C指针链表

 线性表的清空是把原空间中储存的元素清空,clear

线性表的创建是把原来的空间释放了,线性表的结构不存在了,下次再想使用只能重新初始化,free的是空间,destory

#include <iostream>
#include "stdio.h"
#define LIST_INIT_SIZE 10 

typedef int ElemType;//可以更改线性表元素的类型

typedef struct
{
	int* elem;   //指向已分配的一片连续储存空间 
	int  lengh;   //线性表中已添加的数据元素个数
	int  listsize;//线性表中最多能储存的数据元素个数 

}SqList;

int InitList(SqList& L) //创建一个空线性表,elem有空间,无元素
{
	L.elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));//申请Elem对应的内存空间用以存放线性表元素。
	if (L.elem!=NULL) //判断分配空间是否成功
	{	
		L.lengh = 0;     //线性表中已添加的数据元素,初值为0
		L.listsize = LIST_INIT_SIZE; //记录Elem所对应空间的大小。
		printf("线性列表初始化成功!\n");
		return 1;//创建成功返回1
	}
	else
	{
		return 0;
	}
}

int DestoryList(SqList& L) //销毁一个线性表,释放elem内存空间
{
	free(L.elem); //释放空间
	L.elem = NULL;
	L.lengh = 0;
	L.listsize = 0;
	printf("销毁成功!\n");
	return 1;
}

int ClesrList(SqList& L)//清空一个线性表,但仍保留空间
{
	L.lengh  = 0;
	printf("清空成功!\n");
	return 1;
}

int ListEmpty(SqList L)//判断一个线性表是否为空表 
{
	if (L.lengh == 0)
		return 1;//判断是空表返回1 
	else
		return 0;
}

int ListLength(SqList& L)//获得线性表的长度,记忆保存的元素的个数 
{
	return L.lengh;
}

int GetElem(SqList L, int i, int& e)//获得线性表的第i个元素,把值赋值给e
{
	if (i<1 || i>L.lengh)
	{
		return 0;//线性表中没有这个元素 
	}
	e = L.elem[i - 1];//得到第i个元素 
	return 1;
}

int LocateElem(SqList L, int e) //在线性表中找到元素e在登记号位置上 
{
	int i;
	for (i = 0; i < L.lengh; i++)
	{
		if (L.elem[i] == e) //遍历数组,若找到,返回具体位置 
		{
			return i + 1;
		}
	}
	return 0;//若未找到,返回0 
}

int PriorElem(SqList L, int cur_e, int& pre_e) //获得cur_e的前一个元素,赋值给pre_e
{
	int i;
	for (i = 0; i < L.lengh; i++)//首先在线性表中查找cur_e 
	{
		if (L.elem[i] == cur_e)//若找到,退出循环
		{
			break;
		}
	}
	if (i == 0 || i == L.lengh)//数据不存在或无法添加 
	{
		return 0;
	}
	pre_e = L.elem[i - 1];//赋值前驱元素 
	return 1;
}

int NextElem(SqList L, int cur_e, int& next_e) //获得cur_e的后一个元素,赋值给next_e
{
	int i;
	for (i = 0; i < L.lengh; i++)//首先在线性表中查找cur_e 
	{
		if (L.elem[i] == cur_e)//若找到,退出循环
		{
			break;
		}
	}
	if (i == L.lengh - 1 || i == L.lengh)//数据不存在或无法添加 
	{
		return 0;
	}
	next_e = L.elem[i + 1];// 赋值后继元素 
	return 1;
}

int ListInsert(SqList& L, int i, int e)//在第i个元素之前插入一个元素 
{
	int j;
	if (i<1 || i>L.lengh + 1)
	{
		return 0;//判断i的值是否合理 
	}
	if (L.lengh >= L.listsize)
	{
		L.elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));
		// 此时由于表中元素已经将Elem对应的内存空间占满,扩大该空间以容纳更多的表元素
		L.listsize += LIST_INIT_SIZE;// 记录新空间的大小。
	}
	for (j = L.lengh; j >= i-1; j--)
	{
		L.elem[j+1] = L.elem[j ];//一部分元素向后移动一个位置
		L.elem[i - 1] = e;//元素e插入第i号位置
		L.lengh++;//线性表的长度加1
		return 1;
	}
}

int ListModifyElem(SqList L,int i ,int e )
{  // 将线性表中第i个的元素值修改成参数e的值。
	if (i< 1 || i> L.lengh) 
	return 0;
	L.elem[i - 1] = e;
	return 1;
}

int ListDelete(SqList& L, int i, int& e)//删除第i个元素,并返回第i个元素的值 
{
	int j;
	if (i<1 || i>L.lengh)
	{
		return 0;//判断i的值是否合理
	}
	else {
		e = L.elem[i - 1];//把第i个元素的值赋给e
		for (j = i; j < L.lengh; j++)
		{
			L.elem[j - 1] = L.elem[j];//吧第i个元素后面的元素向前移动一个位置
		}
		L.lengh--;//只删除一个元素,线性表长度减少1 
		return 1;
	}
}

int ListTraverse(SqList L)//线性表的遍历,按照从前向后的顺序依次打印输出顺序表中的元素, 
{
	int i;
	for (i = 0; i < L.lengh; i++)
	{
		printf("%d  ", L.elem[i]);
	}
	printf("\n");
	return 1;
}

int main(int argc, char** argv) {
	SqList L;
	int i, n , j;
	ElemType e1, e2, e3, e4, e5, e6, e7, e8, e9;
	InitList(L);//创建线性表
	printf("输出当前的线性列表:\n");
	for (i = 1; i <= 5; i++)
	{
		ListInsert(L, i, i);//插入数据 		
	}
	ListTraverse(L);
	GetElem(L, 1, e1);
	printf("第一个元素是%d:\n",e1);
	GetElem(L, 2, e2);
	printf("第二个元素是%d:\n", e2);
	ListDelete(L, 3, e3);
	printf("第三个元素是:%d,将他删除后:\n",e3);
	printf("输出当前的线性列表:\n");
	ListTraverse(L);
	e4 = ListModifyElem(L, 1, 99);//修改
	printf("把第一个数字修改成99,修改是否成功:%d\n", e4);
	printf("输出当前的线性列表:\n");
	ListTraverse(L);
	e5 = LocateElem(L,4);
	printf("元素4所在的位置是%d:\n",e5);
	e6=ListLength(L);
	printf("当前此链表的长度是%d:\n", e6);
	e7 = ListEmpty(L);
	if (e7 == 1)
	{
		printf("当前线性列表是一个空链表!\n");
	}
	else
	{
		printf("当前线性列表是一个非空链表!\n");
	}
	NextElem(L, 4, e8);
	printf("数字4的后继元素是:%d\n", e8);
	PriorElem(L, 2, e9);
	printf("数字2的前驱元素是:%d\n", e9);
	ClesrList(L);
	e7 = ListEmpty(L);
	if (e7 == 1)
	{
		printf("当前线性列表是一个空链表!\n");
	}
	else
	{
		printf("当前线性列表是一个非空链表!\n");
	}
	DestoryList(L);	
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值