1. 程式人生 > 其它 >動態陣列C語言

動態陣列C語言

技術標籤:c資料結構資料結構指標

題外話:寒假1月12號就開始了,在這之前學校組織了兩週的實訓,做了一個實驗室裝置管理系統,並且還用到了通訊功能。一直想把實驗成果發到csdn,但是最近沉迷在遊戲中(原神),所以一直沒有來得及,只是隔幾天學一會資料結構,抽空把實訓成果上傳一下,記錄一下自己的軌跡。
接下來是正題

動態陣列

動態陣列與c語言自帶的陣列有什麼區別

陣列它涉及到一種存取結構:順序儲存。它是有序的,索引值從0開始的,元素的實際位置和索引相差一位。

下面我將從兩個方面說明他們之間的區別:

  • 儲存型別:c自帶的陣列儲存型別非常單一,只能是c語言提供的基礎型別。而動態陣列則是可以儲存任意型別的資料。
  • 存取量 :c自帶的陣列一旦定義後,它的長度是不能再改變的。而動態陣列是可以改變的。

動態陣列的設計思路

動態陣列使我們自己根據需要進行設計的,因此我們會使用到結構體型別。下面我將做一個簡單地動態int型陣列。

typedef struct List{
     int *head;
     int length;
     int size;
 }List;

提示:typedef 關鍵字可以將struct List賦予一個新名稱 :List(也就是結尾分號前的字母

這裡定義了一個List結構體型別的資料,他有頭指標、長度和大小這三個變數。大小表示了這個變數可以存取的最大元素數量。

我們定義了一個List變數之後,我們並不能直接使用它進行元素的儲存,因為head指標只是指向了一個int型的變數區,需要用malloc函式為其分配記憶體空間。

動態陣列的設計

 List getList(int size){
     /*
      *這個方法旨在實現List的初始化工作,旨在給List型別的head變數分配一個空間
     */
     List l;
     l.size = size;
     l.head = (int*)malloc(l.size*sizeof(int));//為List分配記憶體空間
     if(!l.head){
        printf("初始化失敗");
        exit(0);
     }
     l.length = 0;//空表長度為0
     l.size =
size; return l; }

使用動態陣列:

 int main(){
     printf("Hello World!\n");
     List l = getList(3);
     l.head[0] = 12;
     l.length++;
     l.head[1] = 13;
     l.length++;
     l.head[2] = 34;
     l.length++;//這裡為了記錄陣列長度
     for(int i=0;i<l.length;i++){
         printf("順序表的第%d個元素是:%d\n",i+1,l.head[i]);
     }
     printf("l的長度是:%d,size是:%d",l.length,l.size);
     return 0;
 }

執行結果:
在這裡插入圖片描述
完整程式碼:

#include <stdio.h>
#include<stdlib.h>//為使用malloc函式
 typedef struct List{
     int *head;
     int length;
     int size;
 }List;
 List getList(int size){
     /*
      *這個方法旨在實現List的初始化工作,旨在給List型別的head變數分配一個空間
     */
     List l;
     l.size = size;
     l.head = (int*)malloc(l.size*sizeof(int));//為List分配記憶體空間
     if(!l.head){
        //
        printf("初始化失敗");
        exit(0);
     }
     l.length = 0;//空表長度為0
     l.size = size;
     return l;
 }
int main(){
     printf("Hello World!\n");
     List l = getList(3);
     l.head[0] = 12;
     l.length++;
     l.head[1] = 13;
     l.length++;
     l.head[2] = 34;
     l.length++;//這裡為了記錄陣列長度
     for(int i=0;i<l.length;i++){
         printf("順序表的第%d個元素是:%d\n",i+1,l.head[i]);
     }
     printf("l的長度是:%d,size是:%d",l.length,l.size);
     return 0;
 }