Skip to main content

Data Structures 01 - Linear List

Code

#include <stdio.h>
#include <stdlib.h>

#define LIST_MAX_LENGTH 10 // Define the maximum length of the list

// Define the structure for a sequential list
typedef struct SequentialList
{
int actualLength; // Actual length
int data[LIST_MAX_LENGTH]; // Data array, fixed length
} *SequentialListPtr;

// Output all elements of the sequential list
void outputList(SequentialListPtr paraList)
{
for (int i = 0; i < paraList->actualLength; i++)
{
printf("%d ", paraList->data[i]);
}
printf("\r\n");
}

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

// Initialize the sequential list and fill with initial data
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;
}

// Insert an element at the specified position in the sequential list
void sequentialListInsert(SequentialListPtr paraListPtr, int paraPosition, int paraValue)
{
// Check if there is enough space
if (paraListPtr->actualLength >= LIST_MAX_LENGTH)
{
printf("Cannot insert element: list full.\r\n");
return;
}
// Check if position is valid
if (paraPosition < 0 || paraPosition > paraListPtr->actualLength)
{
printf("Cannot insert element: position out of bounds.\r\n");
return;
}
// Move subsequent elements to make room
for (int i = paraListPtr->actualLength; i > paraPosition; i--)
{
paraListPtr->data[i] = paraListPtr->data[i - 1];
}
// Insert the new element
paraListPtr->data[paraPosition] = paraValue;
// Update actual length
paraListPtr->actualLength++;
}

// Test insertion operations
void sequentialInsertTest()
{
// Test code omitted, same as original code
}

// Delete an element at the specified position in the sequential list and return the deleted element
int sequentialListDelete(SequentialListPtr paraListPtr, int paraPosition)
{
// Check if position is valid
if (paraPosition < 0 || paraPosition >= paraListPtr->actualLength)
{
printf("Invalid position for deletion.\r\n");
return -1;
}
// Save the deleted element
int resultValue = paraListPtr->data[paraPosition];
// Move subsequent elements to fill the gap
for (int i = paraPosition; i < paraListPtr->actualLength - 1; i++)
{
paraListPtr->data[i] = paraListPtr->data[i + 1];
}
// Update actual length
paraListPtr->actualLength--;
// Return the deleted element
return resultValue;
}

// Test deletion operations
void sequentialDeleteTest()
{
// Test code omitted, same as original code
}

// Find the position of a specified element in the sequential list
int locateElement(SequentialListPtr paraListPtr, int paraValue)
{
for (int i = 0; i < paraListPtr->actualLength; i++)
{
if (paraListPtr->data[i] == paraValue)
{
return i; // Element found, return position
}
}
return -1; // Not found, return -1
}

// Get the element at the specified position in the sequential list
int getElement(SequentialListPtr paraListPtr, int paraPosition)
{
// Check if position is valid
if (paraPosition < 0 || paraPosition >= paraListPtr->actualLength)
{
printf("Invalid position for getting element.\r\n");
return -1;
}
// Return the element at the specified position
return paraListPtr->data[paraPosition];
}

// Clear all elements of the sequential list
void clearList(SequentialListPtr paraListPtr)
{
paraListPtr->actualLength = 0;
}

// Main function, program entry point
int main()
{
sequentialInsertTest();
sequentialDeleteTest();
return 0; // Main function return type should be int
}

Running Result