“C
#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]);}
printf("\r\n");
}
void outputMemory(SequentialListPtr paraListPtr){
printf("The address of the structure: %ld\r\n",paraListPtr);
printf("The address of actualLength: %ld\r\n", ¶ListPtr->actualLength);
printf("The address of data: %ld\r\n", ¶ListPtr->data);
printf("The address of actual data: %ld\r\n", ¶ListPtr->data[0]);
printf("The address of second data: %ld\r\n", ¶ListPtr->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;
}
void sequentialListInsert(SequentialListPtr paraListPtr,int paraPosition,int paraValue){
if(paraListPtr->actualLength>=LIST_MAX_LENGTH){
printf("Cannot insert element:list full.\r\n");
return;
}
if(paraPosition<0){
printf("Cannot insert element:negative position unsupported.");
return;
}
if(paraPosition> paraListPtr->actualLength){
printf("Cannot insert element:The position %d is bigger than the list length %d.\r\n",paraPosition,paraListPtr->actualLength) ;
return;
}
for(int i=paraListPtr->actualLength;i>paraPosition;i--){
paraListPtr->data[i]=paraListPtr->data[i-1];
}
paraListPtr->data[paraPosition]= paraValue;
paraListPtr->actualLength++;
}
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: ");
outputList(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);
printf("The list is:");
outputList(tempList);
for(i=0;i<5;i++){
printf("Iserting %d.\r\n",(i+10));
sequentialListInsert(tempList,0,(i+10));
outputList(tempList);
}
printf("---- sequentialInsertTest ends. ----\r\n");
}
int sequentialListDelete(SequentialListPtr paraListPtr,int paraPosition){
if (paraPosition<0){
printf("Invalid position:%d.\r\n",paraPosition);
return -1;
}
if(paraPosition>= paraListPtr->actualLength){
printf("Cannot delete element:The position %d is bigger than the list length %d.\r\n",paraPosition,paraListPtr->actualLength) ;
return -1;
}
int resultValue = paraListPtr->data[paraPosition];
for(int i= paraPosition; i<paraListPtr->actualLength;i++){
paraListPtr->data[i]=paraListPtr->data[i+1];
}
paraListPtr->actualLength--;
return resultValue;
}
void sequentialListDeleteTest(){
int tempArray[5]={3,5,2,7,4};
printf("---- sequentialListDeleteTest begins. ----\r\n");
SequentialListPtr tempList=sequentialListInit(tempArray,5);
outputList(tempList);
printf("Now delete the first, the list is: ");
sequentialListDelete(tempList,0);
outputList(tempList);
printf("Now delete the last, the list is: ");
sequentialListDelete(tempList,3);
outputList(tempList);
printf("Now delete the second,the list is:");
sequentialListDelete(tempList,1);
outputList(tempList);
printf("Now delete the 5th,the list is:");
sequentialListDelete(tempList,5);
outputList(tempList);
printf("Now delete the (-6)th,the list is:");
sequentialListDelete(tempList,-6);
outputList(tempList);
printf("----seqentialDeleteTest ends. ----\r\n");
outputMemory(tempList);
}
int locateElement(SequentialListPtr paraListPtr, int paraValue) {
for(int i=0;i<paraListPtr->actualLength;i++){
return i;
}
return -1;
}
int getElement(SequentialListPtr paraListPtr,int paraPosition){
if(paraPosition<0){
printf("Invalid position:%d.\r\n",paraPosition);
return -1;
}
if(paraPosition>=paraListPtr->actualLength){
printf("Cannot get element: the position %d is beyond the list length %d.\r\n",paraPosition,paraListPtr->actualLength);
return -1;
}
return paraListPtr->data[paraPosition];
}
void clearList(SequentialListPtr paraListPtr){
paraListPtr->actualLength=0;
}
void main(){
sequentialInsertTest();
sequentialListDeleteTest();
}
This is the code."
运行结果
---- sequentialInsertTest begins. ----
After initialization,the list is: 35274
Now insert to the first, the list is: 835274
Now insert to the last, the list is: 8352749
Now insert beyond the tail.
Cannot insert element:The position 8 is bigger than the list length 7.
The list is:8352749
Iserting 10.
108352749
Iserting 11.
11108352749
Iserting 12.
1211108352749
Iserting 13.
Cannot insert element:list full.
1211108352749
Iserting 14.
Cannot insert element:list full.
1211108352749
---- sequentialInsertTest ends. ----
---- sequentialListDeleteTest begins. ----
35274
Now delete the first, the list is: 5274
Now delete the last, the list is: 527
Now delete the second,the list is:57
Now delete the 5th,the list is:Cannot delete element:The position 5 is bigger than the list length 2.
57
Now delete the (-6)th,the list is:Invalid position:-6.
57
----seqentialDeleteTest ends. ----
The address of the structure: 94466643900144
The address of actualLength: 94466643900144
The address of data: 94466643900148
The address of actual data: 94466643900148
The address of second data: 94466643900152
...Program finished with exit code 0
Press ENTER to exit console.
体会:
插入和删除都需要移动表中数据元素,前者需将插入位置后全部数据元素后移一个位置,后者需将删除位置后全部数据元素前移一个位置;
表中数据元素较多且变化较大时,操作过程相对复杂;
动态分配线性表的存储区域可以更有效地利用存储空间,不需要该线性表时可以将其销毁以及时释放占用。