数据结构 C 顺序表

“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", &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: %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;
}

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.

体会:

插入和删除都需要移动表中数据元素,前者需将插入位置后全部数据元素后移一个位置,后者需将删除位置后全部数据元素前移一个位置;

表中数据元素较多且变化较大时,操作过程相对复杂;

动态分配线性表的存储区域可以更有效地利用存储空间,不需要该线性表时可以将其销毁以及时释放占用。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值