数据结构顺序表(作业)

本文档详细介绍了如何使用C语言实现顺序列表的初始化、插入、删除和查找功能,包括内存管理。通过实例展示了在`SequentialList`结构中操作整数数组,以及测试这些操作的效果。
#include <stdio.h>

#include <malloc.h>



#define LIST_MAX_LENGTH 10



/**

*整数的线性列表。关键是数据.

*/

typedef struct SequentialList {

int actualLength;



int data[LIST_MAX_LENGTH];

}*SequentialListPtr;



/**

*输出列表.

*/

voidoutputList(SequentialListPtr paraList){

for(int i = 0;i < paraList->actualLength; i ++) {

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

}// Of for i

printf("\r\n");

}// Of outputList



/**

* 输出列表的内存.

*/

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 actual data: %ld\r\n",&paraListPtr->data[0]);

printf("The address of second data: %d\r\n",&paraListPtr->data[1]);

}//输出内存



/**

*初始化顺序列表。检查此函数时没有错误.

*@param paraListPtr 指向列表的指针.

*@param paraValues 存储所有元素的整数数组.

*/

SequentialListPtr sequnentialListInit(int paraData[],int paraLength) {

SequentialListPtr resultPtr = (SequentialListPtr)malloc(sizeof(SequentialList));

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

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

}// Of for i

resultPtr->actualLength = paraLength;



return resultPtr;

}//Of sequrntialListInit



/**

*I在顺序线性列表中插入一个元素.

*@param paraListPtr 指向列表的指针。它必须是更改列表的指针.

*@param paraPosition 位置,例如,0代表在第一个位置插入.

*@param paraValue 要插入的值
.

*/

void sequentiallistInser(SwquentiallistPtr paraListPtr, int paraPosition,int paravalue){

// 第一步。空间检查.

if (paraListPtr->actualLength >=LIST_MAX_LENGTH){

printf("Cannot insert element: list full.\r\n");

return;

}//Of if



//第二步。位置检查。

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



//Setp 3. 移动剩下的部分。.

for (int i = paralistPtr->actualLength; i > paraposition ; i --) {

paralistPtr->data[i] = paralistPtr->data[i- 1];

}//Of for i



//Step 4. 插入.

paralistPtr->data[paraPosiontion] = paraValue;



//Step 5. 更新长度。

paralistPtr->actualLength ++;

}// 顺序列表插入



/**

* 测试insert函数。

*/

void sequentialInsertTest(){

int i;

int tempArray[5] = {3, 5, 2, 7, 4};



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



//初始化。

SequentialListPtr tempList = sequentialListInit(temparray, 5);

printf("After initialization, the list is:");

ouotputList(tempList);



// 插入到第一个。

printf("Now insert to the first, the list is:");

sequentialListInsert(tempList, 0, 8);

outputList(tempList);



//插入到最后。

printf("Now insert to the last, the list is:");

sequentialListInsert(tempList, 6, 9);

outputList(tempList);



//插入尾部之外。

printf("Now insert beyond the tail.\r\n");

sequentialListInsert(tempList, 8, 9);

peintf("The list is:");

outputList(tempList);



//插入位置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");

}// 或顺序插入测试



/**

*从连续线性列表中删除元素。

*@param paraListptr 指向列表的指针。它必须是更改列表的指针.

*@param paraPosiontion 位置,例如,0代表在第一个位置插入。

*@return 删除的值。.

*/

int sequentialListDelete(SequentialListPtr paraListPtr, int paraPosition){

// Step 1. 位置检查。

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 beyond the list length %d.\r\n", paraposition, paraListPtr->actualLength);

return -1;

}//Of if



//Step 2. 移动剩下的部分。

int resultValue = paraListPtr->data[paraPoisition];

for (int i = paraPoisition; i < paraListPtr->actuaLength; i ++){

paraListPtr->data[i] = paraListPtr->data[i + 1];

}//Of for i



// Step 3. 更新长度。

paraListPtr->actualLength --;



//Step 4.返回值。

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



/**

*在列表中找到一个元素。

* @param paraListPtr 指向列表的指针。

* @param paraValue 指示值。

* @返回值的位置,或-1表示不存在

*/

//查找指定位置的元素的下标 
int localElement(SequentialListPtr paraListPtr,int paravalue) 
{
    for(int i=0;i<paraListPtr->actuallength;i++)    
    {
        if(paraListPtr->date[i] == paravalue)
        {
            return i;
        }
    }
    return -1;
}

//返回目的位置的元素 
int getElement(SequentialListPtr paraListPtr, int paraPosition) {
    //判断元素位置是否合法 
    if (paraPosition < 0) {
        printf("错误位置: %d.\r\n", paraPosition);
        return -1;
    }

    if (paraPosition >= paraListPtr->actualLength) {
        printf("无法删除%d位置的元素,超出了线性表长度%d.\r\n", paraPosition, paraListPtr->actualLength);
        return -1;
    }

    return paraListPtr->data[paraPosition];
}


/**
 * Clear elements in the list.
 * @param paraListPtr The pointer to the list.
 * @return The position of the value, or  -1 indicating not exists
 */
void clearList(SequentialListPtr paraListPtr) {
    paraListPtr->actualLength = 0;
}// Of clearLis


/** 

The entrance.

*/ 

void main() { 

sequentialInsertTest();

sequentialDeleteTest(); 

}// Of main

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值