1. 程式人生 > >資料結構第三週 【專案1

資料結構第三週 【專案1

問題及程式碼:

/*
*(1)目的是要測試“建立線性表”的演算法CreateList,為檢視建表的結果,需要實現“輸出線性表”的演算法DispList。在研習DispList中發現,要輸出線性表,還要判斷表是否為空,這樣,實現判斷線性表是否為空的演算法ListEmpty成為必要。這樣,再加上main函式,這個程式由4個函式構成。main函式用於寫測試相關的程式碼。
* (2)在已經建立線性表的基礎上,求線性表的長度ListLength、求線性表L中指定位置的某個資料元素GetElem、查詢元素LocateElem的演算法都可以實現了。就在原程式的基礎上增加: 
*    增加求線性表的長度ListLength的函式並測試; 
*  增加求線性表L中指定位置的某個資料元素GetElem的函式並測試; 
*   增加查詢元素LocateElem的函式並測試; 
*(3)其餘的4個基本運算:插入資料元素ListInsert、刪除資料元素ListDelete、初始化線性表InitList、銷燬線性表DestroyList都可以同法完成,請自行安排實踐路線。 
*
*/
#include<stdio.h>
#include<malloc.h>
#define Maxsize 50
typedef int Elemtype;
typedef struct
{
	Elemtype date[Maxsize];
	int length;
}Sqlist;
//建立順序表
void CreateList(Sqlist *&L, Elemtype a[ ], int n)
{
	int i;
	L = (Sqlist *)malloc(sizeof(Sqlist));
	for (i = 0; i < n; i++)
		L->date[i] = a[i];
	L->length = n;
}
//初始化順序表
void InitList(Sqlist *&L)
{
	L = (Sqlist*)malloc(sizeof(Sqlist));
	L->length = 0;
}
//銷燬線性表
void DestoryList(Sqlist *&L)
{
	free(L);
}
//判斷線性表是否為空
bool ListEmpty(Sqlist *L)
{
	return(L->length == 0);
}
//求線性表的長度
int ListLength(Sqlist *L)
{
	return (L->length);
} 
//輸出線性表
void DispList(Sqlist *L)
{
	int i;
	for (i = 0; i < L->length; i++)
		printf("%4d", L->date[i]);
	    printf("\n");
}
//求線性表中某個元素
bool GetElem(Sqlist *L, int i, Elemtype &e)
{
	if (i<1 || i>L->length)
		return false;
	e = L->date[i - 1];
	return true;
}
//按元素查詢在表中第一相同元素的位置((邏輯序號從1開始)),若這樣的元素不存在,則返回0
int LocateElem(Sqlist *L, Elemtype e)
{
	int i = 0;
	while (i < L->length&&L->date[i] != e)
		i++;
	if (i >= L->length)
		return 0;
	else
		return i + 1;
}
//插入資料元素
bool ListInsert(Sqlist *&L, int i, Elemtype e)
{
	int j;
	if (i<1 || i>L->length + 1)
		return false;
	i--;
	for (j = L->length; j > i; j--)
		L->date[j] = L->date[j-1];
	L->date[i] = e;
	L->length++;
	return true;
}
//刪除資料元素
bool ListDelete(Sqlist *&L, int i, Elemtype &e)
{
	int j;
	if (i<1 || i>L->length)
		return false;
	i--;    //將順序表邏輯序號轉換為物理序號!!!!!!!
	e = L->date[i];
	for (j = i; j < L->length-1; j++)
		L->date[j] = L->date[j + 1];
	L->length--;
	return true;
}
void CreateList(Sqlist *&L, Elemtype a[], int n);
void InitList(Sqlist *&L);
void DestoryList(Sqlist *&L);
bool ListEmpty(Sqlist *L);
int ListLength(Sqlist *L);
void DispList(Sqlist *L);
bool GetElem(Sqlist *L, int i, Elemtype &e);
int LocateElem(Sqlist *L, Elemtype e);
bool ListInsert(Sqlist *&L, int i, Elemtype e);
bool ListDelete(Sqlist *&L, int i, Elemtype &e);
int main()
{
	Sqlist *sq;
	Elemtype x[6] = { 5,8,7,2,4,9 };
	Elemtype a;
	int t;
	CreateList(sq, x, 6);
	DispList(sq);
	printf("表的長度為:%d\n", ListLength(sq));
	if (GetElem(sq, 4, a))
		printf("找到了第3個元素值為%d\n", a);
	else
		printf("第3個元素超出範圍!\n");
	if (GetElem(sq, 7, a))
		printf("找到了第7個元素值為%d\n", a);
	else
		printf("第7個元素超出範圍!\n");
	if (t =LocateElem(sq,8)> 0)
		printf("找到第一個與8相同的數是第%d個元素\n", t);
	else
		printf("沒有找到值為8的元素\n");
	if (t = LocateElem(sq, 12)> 0)
		printf("找到第一個值為12數是第%d個元素\n", t);
	else
		printf("沒有找到值為12的元素\n");
	ListInsert(sq,3, 6);
	DispList(sq);
	return 0;
}

執行結果:

知識點總結:

1、線性表定義:線性表是具有相同特性資料元素有限序列

2、線性表的順序儲存:把線性表的所有元素按照其邏輯順序依次儲存到計算機指定儲存位置開始的一塊連續的儲存空間中。

      特點:(1)節點中只有自身的資料與,沒有指標域。儲存密度大、儲存空間利用率。

                 (2)可以通過序號直接訪問任何資料元素,即可以隨機儲存

                 (3)插入和刪除操作會引起大量資料元素移動。