线性表work

该博客介绍了线性表的结构体定义,包括实际长度和数据数组。提供了输出线性表、打印数据地址、初始化线性表、插入元素、删除元素等操作的实现。通过示例测试了插入和删除功能,展示了线性表动态变化的过程。此外,还包含了查找元素和获取元素的方法以及清空线性表的函数。
摘要由CSDN通过智能技术生成

线性表:

定义结构体:

typedef struct SequentialList {
	int actualLength;
	int data[LIST_MAX_LENGTH];


} *SequentialListPtr ;

输出线性表:

//依旧是个无聊的遍历
	for (int i = 0; i < paraList->actualLength; i++) {

		printf("%d ", paraList->data[i]);

	}

	putchar('\n');

打印各项数据地址:

void outputMemory(SequentialListPtr paraListPtr) {
	
	printf("The address of the structure:%ld\r\n", paraListPtr);
	printf("The address of  actualLength:%ld\r\n", &paraListPtr->actualLength);
	printf("The address of data:%ld\r\n", &paraListPtr->data);
	printf("The address of the actual data:%ld\r\n", &paraListPtr->data[0]);
	printf("The address of the second data:%ld\r\n", &paraListPtr->data[1]);

}

复制一个一样的线性表:

SequentialListPtr sequentialListInit(int paraData[], int paraLength) {
	SequentialListPtr resultPtr = (SequentialListPtr)malloc(sizeof(struct SequentialList));
	//动态申请 有个缺点 最后好像没释放

	for (int i = 0; i < paraLength; i ++) {

		resultPtr->data[i] = paraData[i];
	}// 

	resultPtr->actualLength = paraLength;
	//复制一个长度

	return resultPtr;

}//Of sequentialListInit

向表中插入值:

void sequentialListInsert(SequentialListPtr paraListPtr, int paraPosition, int paraValue) {
	// Step 1. Space check.
	//判断是否还有容纳空间
	if (paraListPtr->actualLength >= LIST_MAX_LENGTH) {
		printf("Cannot insert element: list full.\r\n");
		return;
	}//Of if

	// Step 2. Position check.
	//判断插入顺序是否合法
	if (paraPosition < 0) {
		printf("Cannot insert element: negative position unsupported.");
		return;
	}//Of if
   //同上判断合法
	if (paraPosition > paraListPtr->actualLength) {
		printf("Cannot insert element: the position %d is bigger than the list length %d.\r\n", paraPosition,
		       paraListPtr->actualLength);
		return;
	}//Of if

	// Step 3. Move the remaining part.
	//从插入位置开始后面的依次往后挪一个位置 给新插入函数提供空位置
	
	for (int i = paraListPtr->actualLength; i > paraPosition; i --) {

		paraListPtr->data[i] = paraListPtr->data[i - 1];
	}//Of for i

	// Step 4. Insert.
	//给值
	paraListPtr->data[paraPosition] = paraValue;

	// Step 5. Update the length.
	//长度+1
	paraListPtr->actualLength ++;
}// Of sequentialListInsert

测试插入:

void sequentialInsertTest() {
	int i;
	int tempArray[5] = {3, 5, 2, 7, 4};

	printf("---- sequentialInsertTest begins. ----\r\n");

	// Initialize.
	SequentialListPtr tempList = sequentialListInit(tempArray, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);

	// Insert to the first.
	printf("Now insert to the first, the list is: ");
	sequentialListInsert(tempList, 0, 8);
	outputList(tempList);

	// Insert to the last.
	printf("Now insert to the last, the list is: ");
	sequentialListInsert(tempList, 6, 9);
	outputList(tempList);

	// Insert beyond the tail.
	printf("Now insert beyond the tail. \r\n");
	sequentialListInsert(tempList, 8, 9);
	printf("The list is:");
	outputList(tempList);

	// Insert to position 3.
	for (i = 0; i < 5; i ++) {

		printf("Inserting %d.\r\n", (i + 10));
		sequentialListInsert(tempList, 0, (i + 10));
		outputList(tempList);
	}//Of for i

	printf("---- sequentialInsertTest ends. ----\r\n");
}// Of sequentialInsertTest

删除数据:

int sequentialListDelete(SequentialListPtr paraListPtr, int paraPosition) {
	// Step 1. Position check.
	//依旧进行判断是否合法删除
	
	if (paraPosition < 0) {
		printf("Invalid position: %d.\r\n", paraPosition);
		return -1;
	}//Of if

	if (paraPosition >= paraListPtr->actualLength) {
		printf("Cannot delete element: the position %d is beyond the list length %d.\r\n", paraPosition,
		       paraListPtr->actualLength);
		return -1;
	}//Of if

	// Step 2. Move the remaining part.
	int resultValue = paraListPtr->data[paraPosition];
    //删除完了往前挪吧
	for (int i = paraPosition; i < paraListPtr->actualLength; i ++) {

		paraListPtr->data[i] = paraListPtr->data[i + 1];
	}//Of for i

	// Step 3. Update the length.
	paraListPtr->actualLength --;

	// Step 4. Return the value.
	return resultValue;
}// Of sequentialListDelete

删除测试:

void sequentialDeleteTest() {
	int tempArray[5] = {3, 5, 2, 7, 4};

	printf("---- sequentialDeleteTest begins. ----\r\n");

	// Initialize.
	SequentialListPtr tempList = sequentialListInit(tempArray, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);

	// Delete the first.
	printf("Now delete the first, the list is: ");
	sequentialListDelete(tempList, 0);
	outputList(tempList);

	// Delete to the last.
	printf("Now delete the last, the list is: ");
	sequentialListDelete(tempList, 3);
	outputList(tempList);

	// Delete the second.
	printf("Now delete the second, the list is: ");
	sequentialListDelete(tempList, 1);
	outputList(tempList);

	// Delete the second.
	printf("Now delete the 5th, the list is: ");
	sequentialListDelete(tempList, 5);
	outputList(tempList);

	// Delete the second.
	printf("Now delete the (-6)th, the list is: ");
	sequentialListDelete(tempList, -6);
	outputList(tempList);

	printf("---- sequentialDeleteTest ends. ----\r\n");

	outputMemory(tempList);
}// Of sequentialDeleteTest

locateElement:

int locateElement(SequentialListPtr paraListPtr, int number) {
	for (int i = 0; i < paraListPtr->actualLength; i ++) {

		if (paraListPtr->data[i] == number) {
			return i;
		}// Of if

		//遍历找对应数字 返回其下标
	}//Of for i

	return -1;



	//未找到 返回-1
}//

getElement:

int getElement(SequentialListPtr paraListPtr, int Position) {
	// Step 1. Position check.
	if (Position < 0 || Position > LIST_MAX_LENGTH) {
		//判断输入位置是否合法

		printf("Invalid position: %d.\r\n", Position);
		return -1;
	}//Of if

	//一个if 判断更加简便直接

	return paraListPtr->data[Position];
	//合法即返回值
}//

clearList:

void clearList(SequentialListPtr paraListPtr) {

	for (int i = 0; i < LIST_MAX_LENGTH; i++) {

		paraListPtr->data[i] = 0;

	}

	//初始化数组值

	paraListPtr->actualLength = 0;
	//长度初始0;


}//

总体代码:

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

#define LIST_MAX_LENGTH 10

typedef struct SequentialList {
	int actualLength;
	int data[LIST_MAX_LENGTH];


} *SequentialListPtr ;

//输出线性表
void outputList(SequentialListPtr paraList) {
	//依旧是个无聊的遍历
	for (int i = 0; i < paraList->actualLength; i++) {

		printf("%d ", paraList->data[i]);

	}

	putchar('\n');

}

//打印各项数据地址叭

void outputMemory(SequentialListPtr paraListPtr) {
	
	printf("The address of the structure:%ld\r\n", paraListPtr);
	printf("The address of  actualLength:%ld\r\n", &paraListPtr->actualLength);
	printf("The address of data:%ld\r\n", &paraListPtr->data);
	printf("The address of the actual data:%ld\r\n", &paraListPtr->data[0]);
	printf("The address of the second data:%ld\r\n", &paraListPtr->data[1]);

}

//复制一个一样的线性表

SequentialListPtr sequentialListInit(int paraData[], int paraLength) {
	SequentialListPtr resultPtr = (SequentialListPtr)malloc(sizeof(struct SequentialList));
	//动态申请 有个缺点 最后好像没释放

	for (int i = 0; i < paraLength; i ++) {

		resultPtr->data[i] = paraData[i];
	}// 

	resultPtr->actualLength = paraLength;
	//复制一个长度

	return resultPtr;

}//Of sequentialListInit




//插入值

void sequentialListInsert(SequentialListPtr paraListPtr, int paraPosition, int paraValue) {
	// Step 1. Space check.
	//判断是否还有容纳空间
	if (paraListPtr->actualLength >= LIST_MAX_LENGTH) {
		printf("Cannot insert element: list full.\r\n");
		return;
	}//Of if

	// Step 2. Position check.
	//判断插入顺序是否合法
	if (paraPosition < 0) {
		printf("Cannot insert element: negative position unsupported.");
		return;
	}//Of if
   //同上判断合法
	if (paraPosition > paraListPtr->actualLength) {
		printf("Cannot insert element: the position %d is bigger than the list length %d.\r\n", paraPosition,
		       paraListPtr->actualLength);
		return;
	}//Of if

	// Step 3. Move the remaining part.
	//从插入位置开始后面的依次往后挪一个位置 给新插入函数提供空位置
	
	for (int i = paraListPtr->actualLength; i > paraPosition; i --) {

		paraListPtr->data[i] = paraListPtr->data[i - 1];
	}//Of for i

	// Step 4. Insert.
	//给值
	paraListPtr->data[paraPosition] = paraValue;

	// Step 5. Update the length.
	//长度+1
	paraListPtr->actualLength ++;
}// Of sequentialListInsert

//--------------------------------------------------------------------------------------------------------
//测试插入

void sequentialInsertTest() {
	int i;
	int tempArray[5] = {3, 5, 2, 7, 4};

	printf("---- sequentialInsertTest begins. ----\r\n");

	// Initialize.
	SequentialListPtr tempList = sequentialListInit(tempArray, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);

	// Insert to the first.
	printf("Now insert to the first, the list is: ");
	sequentialListInsert(tempList, 0, 8);
	outputList(tempList);

	// Insert to the last.
	printf("Now insert to the last, the list is: ");
	sequentialListInsert(tempList, 6, 9);
	outputList(tempList);

	// Insert beyond the tail.
	printf("Now insert beyond the tail. \r\n");
	sequentialListInsert(tempList, 8, 9);
	printf("The list is:");
	outputList(tempList);

	// Insert to position 3.
	for (i = 0; i < 5; i ++) {

		printf("Inserting %d.\r\n", (i + 10));
		sequentialListInsert(tempList, 0, (i + 10));
		outputList(tempList);
	}//Of for i

	printf("---- sequentialInsertTest ends. ----\r\n");
}// Of sequentialInsertTest
//--------------------------------------------------------------------------------------------------------

//删除数据

int sequentialListDelete(SequentialListPtr paraListPtr, int paraPosition) {
	// Step 1. Position check.
	//依旧进行判断是否合法删除
	
	if (paraPosition < 0) {
		printf("Invalid position: %d.\r\n", paraPosition);
		return -1;
	}//Of if

	if (paraPosition >= paraListPtr->actualLength) {
		printf("Cannot delete element: the position %d is beyond the list length %d.\r\n", paraPosition,
		       paraListPtr->actualLength);
		return -1;
	}//Of if

	// Step 2. Move the remaining part.
	int resultValue = paraListPtr->data[paraPosition];
    //删除完了往前挪吧
	for (int i = paraPosition; i < paraListPtr->actualLength; i ++) {

		paraListPtr->data[i] = paraListPtr->data[i + 1];
	}//Of for i

	// Step 3. Update the length.
	paraListPtr->actualLength --;

	// Step 4. Return the value.
	return resultValue;
}// Of sequentialListDelete

//--------------------------------------------------------------------------------------------------------
//删除测试
void sequentialDeleteTest() {
	int tempArray[5] = {3, 5, 2, 7, 4};

	printf("---- sequentialDeleteTest begins. ----\r\n");

	// Initialize.
	SequentialListPtr tempList = sequentialListInit(tempArray, 5);
	printf("After initialization, the list is: ");
	outputList(tempList);

	// Delete the first.
	printf("Now delete the first, the list is: ");
	sequentialListDelete(tempList, 0);
	outputList(tempList);

	// Delete to the last.
	printf("Now delete the last, the list is: ");
	sequentialListDelete(tempList, 3);
	outputList(tempList);

	// Delete the second.
	printf("Now delete the second, the list is: ");
	sequentialListDelete(tempList, 1);
	outputList(tempList);

	// Delete the second.
	printf("Now delete the 5th, the list is: ");
	sequentialListDelete(tempList, 5);
	outputList(tempList);

	// Delete the second.
	printf("Now delete the (-6)th, the list is: ");
	sequentialListDelete(tempList, -6);
	outputList(tempList);

	printf("---- sequentialDeleteTest ends. ----\r\n");

	outputMemory(tempList);
}// Of sequentialDeleteTest
//--------------------------------------------------------------------------------------------------------




//111111111111
int locateElement(SequentialListPtr paraListPtr, int number) {
	for (int i = 0; i < paraListPtr->actualLength; i ++) {

		if (paraListPtr->data[i] == number) {
			return i;
		}// Of if

		//遍历找对应数字 返回其下标
	}//Of for i

	return -1;



	//未找到 返回-1
}//
//111111111111
int getElement(SequentialListPtr paraListPtr, int Position) {
	// Step 1. Position check.
	if (Position < 0 || Position > LIST_MAX_LENGTH) {
		//判断输入位置是否合法

		printf("Invalid position: %d.\r\n", Position);
		return -1;
	}//Of if

	//一个if 判断更加简便直接

	return paraListPtr->data[Position];
	//合法即返回值
}//

//111111111111
void clearList(SequentialListPtr paraListPtr) {

	for (int i = 0; i < LIST_MAX_LENGTH; i++) {

		paraListPtr->data[i] = 0;

	}

	//初始化数组值

	paraListPtr->actualLength = 0;
	//长度初始0;


}//


int main() {
	sequentialInsertTest();
	sequentialDeleteTest();
}// Of main

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值