1. 程式人生 > >資料結構之線性表的順序儲存結構(陣列)的插入與刪除

資料結構之線性表的順序儲存結構(陣列)的插入與刪除

線性表的順序存數結構:指的是用一段地址連續的儲存單元一次儲存線性表的資料元素      在記憶體中找塊記憶體,把相同資料型別的資料元素一次存放在這塊空間中。可以用以為陣列來實現順序儲存結構。陣列的長度是存放線性表的儲存空間的長度,線性表的長度是資料元素實際的個數。線性表的長度應該限於等於陣列的長度      優點:無需為表中元素之間的邏輯關係而增加額外的儲存空間;可以快速的存取表中任一位置的元素      缺點:插入和刪除操作需要移動大量元素;當線性表長度變化較大時,難以確定儲存空間的容量;造成儲存空間的碎片

實現程式碼:

#include<stdio.h>
#define size 50


int getLength(char *string){//獲取字串長度
	int i = 0;
	while(string[i] != '\0' ){
		i++;
	}

	return i+1;
}

int insert(char * string , int i , char newChar,int *length){//在字串 string 指定位置 i 插入新字元newChar,更改字串長度 length
	int j = *length;
	if( i <= 0 || i > *length){//指定位置不合法
		return 0;	
	}
	if( i < *length){ //指定位置在字串中間,從末尾開始至指定位置的字元全部往後移一位
		for(; j >= i ; j--){
			string[j] = string[j-1];
		}
		string[j] = newChar;//指定位置更換成新字元
	}
	*length += 1;//字串長度增加1
	return 1;
}


int deleteCh(char *string , int i, char *deleteChar,int *length){//刪除字串string 位置 i上的字元,deleteChar記錄刪除字元,更改字串的長度length
	int j ;
	char status[10];
	char *p = status;
	if(i <= 0 || i > *length){// 位置i不合法
		return 0;
	}

	if(i < *length){//位置在字串中間
		*deleteChar = string[i-1];//deleteChar記錄刪除字元
		for( j = i-1 ; j < *length ; j++ ){//從刪除字元位置i開始的後面所有字元往前移一位
			string[j] = string[j+1];
		}
		string[j] = '\0';//設定末尾字元為結束字元
	}
	*length -=1;//字串長度減1
	return 1;
}





void main(){
	char array[size];
	char *string = array;//字串

	int length ;//記錄字串的長度
	char deleteChar;//記錄被刪除的字元
	int insertPosition;//插入的位置
	int deletePosition;//刪除的位置

	printf("please input a string:");
	scanf("%s",string);//輸入一串字元
	printf("\n");
	
	length = getLength(string);//返回字串的長度
	printf("%d\n",length);

	printf("請輸入插入位置:");//輸入插入的位置
	scanf("%d",&insertPosition);

	insert(string,insertPosition,'A',&length);//在string字串中的insertPosition位置上插入字元A
	printf("%s\n",string);

	printf("請輸入刪除的位置:");
	scanf("%d",&deletePosition);//輸入刪除位置
	deleteCh(string,deletePosition,&deleteChar,&length);
	printf("%s\t刪除的字元為:%c\n",string,deleteChar);

}