1. 程式人生 > >連續儲存陣列的方法

連續儲存陣列的方法

目錄

連續儲存的代表應用:陣列

1)結構體的定義:

2)基本操作

對資料進行初始化

判斷陣列是否為空

輸出陣列

判斷陣列是否滿

追加元素

插入陣列元素

刪除陣列元素

逆序

對陣列進行排序


這篇筆記是根據郝斌老師的上課講義整理而得:

模組一:線性結構

        演算法相當成熟;棧和佇列是一種特殊的線性結構 把所有的節點用一根直線串起來

連續儲存的代表應用:陣列

     1. 什麼叫陣列
                 元素型別相同,大小相等
     2. 陣列的優缺點:
                 存取速度快
                 插入元素很慢,空間通常是有限制的,需要知道陣列的長度

1)結構體的定義:

#include <stdio.h> 
#include <malloc.h>//包含了malloc函式 
#include <stdlib.h>//包含了exit函式 

/*定義了一個數據型別,該資料型別的名字叫做struct Arr,
該資料型別含有三個成員,分別是pBase、len、cnt*/ 
struct Arr 
{ 
    int *pBase; //儲存的是陣列的第一個元素的地址 
    int len; //陣列所能容納的最大元素的個數             
    int cnt;//當前陣列有效的元素的個數 
};

2)基本操作

void init_arr(struct Arr *pArr, int length);//對陣列進行初始化
bool append_arr(struct Arr *pArr, int val); //追加元素 
bool insert_arr(struct Arr *pArr, int pose, int val);//插入資料元素
bool delete_arr(struct Arr *pArr, int pose,int *pVal);//刪除資料元素,*pVal返回刪除元素的值 
bool is_empty(struct Arr *pArr);//判斷陣列是否為空 
bool is_full(struct Arr *pArr);//判斷陣列是否滿 
void sort_arr(struct Arr *pArr);//對陣列進行排序,氣泡排序 
void show_arr(struct Arr *pArr);//輸出陣列 
void inversion_arr(struct Arr *pArr);//逆序

對資料進行初始化

void init_arr(struct Arr *pArr, int length)
{
    pArr->pBase = (int*)malloc(sizeof(int) * length);
    if (NULL == pArr->pBase)
    {
        printf("動態記憶體分配失敗!\n");
        exit(-1);
    }
    else
    {
        pArr->len = length;
        pArr->cnt = 0;
    }

    return;
}

判斷陣列是否為空

bool is_empty(struct Arr *pArr)
{
    if (0 == pArr->cnt)
        return True;
    else
        return false;
}

輸出陣列

void show_arr(struct Arr *pArr)
{
    if (is_empty(pArr))
        printf("陣列為空!\n");
    else
    {
        for(int i=0; i<pArr->cnt; i++)
            printf("%d ", pArr->pBase[i]);
        printf("\n");
    }
}

判斷陣列是否滿

bool is_full(struct Arr *pArr)
{
    if (pArr->cnt == pArr->len)
        return true;
    else
        return false;
}

追加元素

bool append_arr(struct Arr *pArr, int val) 
{ 
    if (is_full(pArr)) 
        return false;

    pArr->pBase[pArr->cnt] = val; 
    (pArr->cnt)++; 
    return true;
}

插入陣列元素

bool insert_arr(struct Arr * pArr, int pos, int val)//在pose前面插入元素
{
	int i;
 
	if (is_full(pArr))
		return false;
 
	if (pos<1 || pos>pArr->cnt+1)
		return false;
 
	for (i=pArr->cnt-1; i>=pos-1; --i)
	{
		pArr->pBase[i+1] = pArr->pBase[i];
	}
	pArr->pBase[pos-1] = val;
	(pArr->cnt)++;
	return true;
}

刪除陣列元素

bool delete_arr(struct Arr * pArr, int pos, int * pVal)
{
	int i;
 
	if ( is_empty(pArr) )
		return false;
	if (pos<1 || pos>pArr->cnt)
		return false;
 
	*pVal = pArr->pBase[pos-1];////先進行賦值,以免進行刪除操作之後沒有返回值
	for (i=pos; i<pArr->cnt; ++i)
	{
		pArr->pBase[i-1] = pArr->pBase[i];
	}
	pArr->cnt--;
	return true;
}

逆序

void inversion_arr(struct Arr * pArr)
{
	int i = 0;
	int j = pArr->cnt-1;
	int t;
 
	while (i < j)
	{
		t = pArr->pBase[i];
		pArr->pBase[i] = pArr->pBase[j];
		pArr->pBase[j] = t;//兩兩交換
		++i;
		--j;
	}
	return;
}

對陣列進行排序

void sort_arr(struct Arr * pArr)
{
	int i, j, t;
 
	for (i=0; i<pArr->cnt; ++i)
	{
		for (j=i+1; j<pArr->cnt; ++j)
		{
			if (pArr->pBase[i] > pArr->pBase[j])
			{
				t = pArr->pBase[i];
				pArr->pBase[i] = pArr->pBase[j];
				pArr->pBase[j] = t;
			}
		}
	}
}