线性表的认知

1.线性表概念

        线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

2.线性表的操作

操作一般有以下几种:

1)线性表的创建:

typedef struct List{
	int data[MAXSIZE];
	int LineLength;
} *ListPtr;

2)打印线性表:

void outputList(ListPtr L)   {  //打印这个线性表 

	for(int i = 0; i < L->LineLength; i++ )
	{
		printf("%d ", L->data[i]);
	}
	printf("\n");
}

3)线性表的赋值:(选择用数组)

ListPtr ListInit(int paraData[], int paraLength) {   //将数组赋值给线性表 
	ListPtr resP = (List*)malloc(sizeof(List));   //申请空间 
	for(int i = 0; i < paraLength; i++) 
	{ 
		resP->data[i] = paraData[i];   //赋值 
	}
	resP->LineLength = paraLength;   //长度赋值 
	printf("\n");
	return resP;   //返回线性表 
}

4)数据进行插入线性表操作:

void ListInsert(ListPtr L, int paraPostion, int paraData){  // 数据的插入,  线性表   数据的位置  数据的值 
	//1.先行判断空间是否已满
	if(L->LineLength >= MAXSIZE)
	{
		printf("Cannot insert element : List is full");
		return;
	 }
	//2.再进行判断插入位置是否合法
	if(paraPostion > L->LineLength  || paraPostion < 0)
	{
		printf("Cannot insert element : Postion is bigger than LineLength or Postion is smaller than 0!\n");
		return;
	}
	//前两关过关证明可以插入数据了 
	//3.开始移动数据
	for(int i = L->LineLength; i > paraPostion; i--)
	{
		L->data[i] = L->data[i-1];    //向后面移动一位来给插入数据提供空间 
	}
	//开插!
	L->data[paraPostion] = paraData;
	
	//最后不忘线性表长度加1;
	L->LineLength++; 
	
}   //搞定! 

5)插入测试:

void Inserttext()   
{
	int i;
	int array[5] = {7, 0, 4, 9, 6};
	
	printf("---- sequentialInsertTest begins. ----\r\n");
	
	//创建线性表!
	ListPtr tempList =  ListInit(array, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);
	//在首位插入一个元素!
	printf("Now insert to the first, the list is: ");
	ListInsert(tempList, 0, 5);
	outputList(tempList);
	//在末尾插入一个元素!
	printf("Now insert to the last, the list is: ");
	ListInsert(tempList, 6, 8);
	outputList(tempList);
	//没事找事插入一个很远或负数位置的元素
	printf("Now insert beyond the tail. \r\n");
	ListInsert(tempList, 1000, 666);
	ListInsert(tempList, -6, 777);
	outputList(tempList);
	
	//这个就表演一下插入操作,一直给首位插 
	/*	for (i = 0; i < 5; i ++) {

		printf("Inserting %d\n", (i + 10));
		LineInsert(tempList, 0, (i + 10));
		outputList(tempList);
	} */
}

6)指定位置元素删除:

int ListDelete(ListPtr L, int paraPostion){ //删除指定位置的元素并返回删除的值, 无法找到该元素则返回-1; 
	//和插入元素很像
	//判断postion是否合法捏
	if(paraPostion > L->LineLength  || paraPostion < 0)
	{
		printf("Cannot insert element : Postion is bigger than LineLength or Postion is smaller than 0!\n");
		return -1;
	}
	//直接保存数据
	int data = L->data[paraPostion];
	//直接移动数据进行覆盖
	for(int i = paraPostion; i < L->LineLength; i++)
	{
		L->data[i] = L->data[i+1];
	}
	//更新length
	L->LineLength--;
	//返回值
	return data;	 

}

7)删除测试:

void Deletetext()
{
	int array[5] = {7, 0, 4, 9, 6};
	
	printf("---- sequentialDeleteTest begins. ----\r\n");
	
	ListPtr tempList = ListInit(array, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);
	
	//删除第一个元素!
	printf("Now delete the first, the list is: ");
	ListDelete(tempList, 0);
	outputList(tempList); 
	//删除最后一个元素!
	printf("Now delete the last, the list is: ");
	ListDelete(tempList, 3);
	outputList(tempList);
	//再删 第四个元素
	printf("Now delete the last, the list is: ");
	ListDelete(tempList, 3);
	outputList(tempList);
	//删负
	printf("Now delete the (-6)th, the list is: \n");
	ListDelete(tempList, -6);
	outputList(tempList); 
}

8)返回指定元素位置:

int locateElement(ListPtr L, int paradata){ //返回想要元素第一次出现的位置,若不存在,则返回-1; 
	for(int i = 0; i < L->LineLength; i++)
	{
		if(L->data[i] == paradata)
		return i;
		
	}
	return -1;
}

9)返回目的位置的元素:

int GetElement(ListPtr L, int paraPostion){ //返回目的位置的元素
	//先判断位置合不合法
	if(paraPostion > L->LineLength  || paraPostion < 0)
	{
		printf("Cannot insert element : Postion is bigger than LineLength or Postion is smaller than 0!\n");
		return -1;
	}
	
	//合法了就直接return不就行了?
	return L->data[paraPostion]; 
}

10)clear操作:

void ClearList(ListPtr L)   //清空线性表 
{
 L->LineLength=0;
 return;
}  

最后就是所有代码:

#include<stdio.h>
#include<malloc.h>

#define MAXSIZE 100
#define isMyFaith main//夹带私货 

typedef int Kurumi;   //夹带私货 

typedef struct List{
	int data[MAXSIZE];
	int LineLength;
} *ListPtr;
//函数 
void Inserttext();           //插入测试 
void Deletetext();           //删除测试 
void outputList(ListPtr L);  //打印这个线性表 
void outputMemory(ListPtr L); //打印一些地址啊 
void ListInsert(ListPtr L, int paraPostion, int paraData); // 数据的插入,  线性表   数据的位置  数据的值 
int ListDelete(ListPtr L, int paraPostion);                // 删除指定位置的元素并返回删除的值, 无法找到该元素则返回-1; 
int locateElement(ListPtr L, int paradata);                // 返回想要元素第一次出现的位置,若不存在,则返回-1; 
int GetElement(ListPtr L, int paraPostion);                //返回目的位置的元素
ListPtr ListInit(int paraData[], int paraLength);          //将数组赋值给线性表 

void outputList(ListPtr L)   {  //打印这个线性表 

	int i = 0;
	for(i = 0; i < L->LineLength; i++ )
	{
		printf("%d ", L->data[i]);
	}
	if(i == 0)
	{
		printf("the list is empty!");
	}
	printf("\n");
}

void outputMemory(ListPtr L) {        //打印一些地址啊 
	printf("The address of the structure: %ld\r\n", L);
    printf("The address of actualLength: %ld\r\n", &L->LineLength);
    printf("The address of data: %ld\r\n", &L->data);
    printf("The address of actual data: %ld\r\n", &L->data[0]);
    printf("The address of second data: %ld\r\n", &L->data[1]);
}

ListPtr ListInit(int paraData[], int paraLength) {   //将数组赋值给线性表 
	ListPtr resP = (List*)malloc(sizeof(List));   //申请空间 
	for(int i = 0; i < paraLength; i++) 
	{ 
		resP->data[i] = paraData[i];   //赋值 
	}
	resP->LineLength = paraLength;   //长度赋值 
	printf("\n");
	return resP;   //返回线性表 
}


void ListInsert(ListPtr L, int paraPostion, int paraData){  // 数据的插入,  线性表   数据的位置  数据的值 
	//1.先行判断空间是否已满
	if(L->LineLength >= MAXSIZE)
	{
		printf("Cannot insert element : List is full");
		return;
	 }
	//2.再进行判断插入位置是否合法
	if(paraPostion > L->LineLength  || paraPostion < 0)
	{
		printf("Cannot insert element : Postion is bigger than LineLength or Postion is smaller than 0!\n");
		return;
	}
	//前两关过关证明可以插入数据了 
	//3.开始移动数据
	for(int i = L->LineLength; i > paraPostion; i--)
	{
		L->data[i] = L->data[i-1];    //向后面移动一位来给插入数据提供空间 
	}
	//开插!
	L->data[paraPostion] = paraData;
	
	//最后不忘线性表长度加1;
	L->LineLength++; 
	
}   //搞定! 

void Inserttext()   
{
	int i;
	int array[5] = {7, 0, 4, 9, 6};
	
	printf("---- sequentialInsertTest begins. ----\r\n");
	
	//创建线性表!
	ListPtr tempList =  ListInit(array, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);
	//在首位插入一个元素!
	printf("Now insert to the first, the list is: ");
	ListInsert(tempList, 0, 5);
	outputList(tempList);
	//在末尾插入一个元素!
	printf("Now insert to the last, the list is: ");
	ListInsert(tempList, 6, 8);
	outputList(tempList);
	//没事找事插入一个很远或负数位置的元素
	printf("Now insert beyond the tail. \r\n");
	ListInsert(tempList, 1000, 666);
	ListInsert(tempList, -6, 777);
	outputList(tempList);
	
	//这个就表演一下插入操作,一直给首位插 
	/*	for (i = 0; i < 5; i ++) {

		printf("Inserting %d\n", (i + 10));
		LineInsert(tempList, 0, (i + 10));
		outputList(tempList);
	} */
}

int ListDelete(ListPtr L, int paraPostion){ //删除指定位置的元素并返回删除的值, 无法找到该元素则返回-1; 
	//和插入元素很像
	//判断postion是否合法捏
	if(paraPostion > L->LineLength  || paraPostion < 0)
	{
		printf("Cannot insert element : Postion is bigger than LineLength or Postion is smaller than 0!\n");
		return -1;
	}
	//直接保存数据
	int data = L->data[paraPostion];
	//直接移动数据进行覆盖
	for(int i = paraPostion; i < L->LineLength; i++)
	{
		L->data[i] = L->data[i+1];
	}
	//更新length
	L->LineLength--;
	//返回值
	return data;	 

}

void Deletetext()
{
	int array[5] = {7, 0, 4, 9, 6};
	
	printf("---- sequentialDeleteTest begins. ----\r\n");
	
	ListPtr tempList = ListInit(array, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);
	
	//删除第一个元素!
	printf("Now delete the first, the list is: ");
	ListDelete(tempList, 0);
	outputList(tempList); 
	//删除最后一个元素!
	printf("Now delete the last, the list is: ");
	ListDelete(tempList, 3);
	outputList(tempList);
	//再删 第四个元素
	printf("Now delete the last, the list is: ");
	ListDelete(tempList, 3);
	outputList(tempList);
	//删负
	printf("Now delete the (-6)th, the list is: \n");
	ListDelete(tempList, -6);
	outputList(tempList); 
}

int locateElement(ListPtr L, int paradata){ //返回想要元素第一次出现的位置,若不存在,则返回-1; 
	for(int i = 0; i < L->LineLength; i++)
	{
		if(L->data[i] == paradata)
		return i;
		
	}
	return -1;
}

int GetElement(ListPtr L, int paraPostion){ //返回目的位置的元素
	//先判断位置合不合法
	if(paraPostion > L->LineLength  || paraPostion < 0)
	{
		printf("Cannot insert element : Postion is bigger than LineLength or Postion is smaller than 0!\n");
		return -1;
	}
	
	//合法了就直接return不就行了?
	return L->data[paraPostion]; 
}

void ClearList(ListPtr L)
{
 L->LineLength=0;
 return;
}  
Kurumi isMyFaith()
{

	Inserttext(); //测试 
	Deletetext(); //测试 
	int a[5] = {5, 7, 0, 4, 9};
	ListPtr  L2 = ListInit(a, 5);
	ClearList(L2);   //清空线性表 
	outputList(L2);  //尝试输出 
	ListInsert(L2, 0, 666);  //插入一个 
	outputList(L2);
	
	return 0;
}

谢谢阅览,如有错误,欢迎指出!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值