談談數據結構1-----線性表(順序表)

目錄

1,順序表的基本概念及特點:

1.1靜態存儲:

1.2動態存儲表示

2,順序表的基本操作(動態)

3,順序表的應用演示:

3.1 集合的並運算,合併集合LA與LB,結果存於LA中,重複元素只留一個。

3.2 求順序表LA與LB中公共的元素,結果存於LA中


1,順序表的基本概念及特點:

1,把線性表中元素按照其邏輯順序依次存儲在一塊連續的存儲空間中,就得到了順序表,它是用一維數組作爲其存儲結構的,其中一維數組的分配可以是靜態的也可以是動態的,表中元素的邏輯順序與物理順序相同。

2,對於順序表中的元素,既可以順序訪問也可以隨機訪問,順序表中第i個元素存儲在數組下標尾i-1的位置

3,假設順序表A的起始存儲位置是Loc(1),第i個元素的存儲位置爲Loc(i),則有:

Loc(i)=Loc(1)+(i-1)*sizeof(DataType).,其中Loc(1)是首元的存儲位置。

1.1靜態存儲:

1,在靜態存儲中,由於數組的大小是事先分配好的,所以說數組的空間已經固定,空間一旦佔滿,再向數組裏面添加數據會導致數組元素溢出,程序崩潰。

#include<stdio.h>
#define MaxSize 50          //預定義順序表最大長度
#define DataType int        //預定義順序表元素類型
typedef struct {
	DataType data[MaxSize]; //順序表的元素
	int length;             //順序表的當前長度
}SeqList;                    //順序表的類型定義

1.2動態存儲表示

1,順序表的存儲空間是程序在執行過程中通過動態存儲分配函數malloc動態分配的,一旦空間佔滿,還可以另外在分配更大的存儲空間從而達到擴充數組的目的。

#pragma once
#include<stdio.h>
typedef int DataType;
#define initSize 30
typedef struct {
	DataType *data;
	int maxSize, n;
}SeqList;

2,順序表的基本操作(動態)

void initList(SeqList &L)//初始化操作
{
	L.data = (DataType*)malloc(initSize * sizeof(DataType));
	if (!L.data) {
		printf(" is error!\n");
		exit(1);
	}
	L.maxSize = initSize;
	L.n = 0;
}
void clearList(SeqList &L)//清除順序表操作
{
	L.n = 0;
}
int getLength(SeqList &L)//獲取順序表長度操作
{
	return L.n;
}
bool isEmpty(SeqList &L)//判斷順序表是否爲空操作
{
	return L.n == 0;
}
int Search(SeqList &L, DataType x)//在順序表中查詢某個元素,成功返回元素下表,否則返回-1
{
	for (int i = 0; i <L.n; i++)
	{
		if (L.data[i] == x)
			return i;
	}
	return -1;
}
int Locate(SeqList &L, int i)//定位某個元素在順序表中的位置,成功返回下表,否則返回-1
{
	if (i > 0 && i < L.n)
		return i - 1;
	else
		return -1;
}
bool Insert(SeqList &L, int i, DataType &x)//在順序表的某個位置插入一個元素
{
	if (L.n == L.maxSize)//判斷順序表是否滿,滿的話擴大存儲空間
		L.data = (DataType *)realloc(L.data, (2*initSize) * sizeof(DataType));
	if (!L.data)
		return false;
	if (i <= 0 || i>L.n + 1)//判斷插入位置是否合理
		return false;
	for (int j = L.n - 1; j >= i - 1; j--)
		L.data[j + 1] = L.data[j];
	L.data[i - 1] = x;
	L.n++;
	return true;
}
bool remove(SeqList &L, int i, DataType &x)//在順序表中刪除某個元素操作
{
	if (!L.n)
		return false;
	if (i<0 || i>L.n - 1)//判斷刪除位置是否合理
		return false;
	x = L.data[i - 1];
	for (int j = i; j < L.n; j++)
		L.data[j - 1] = L.data[j];
	L.n--;
	return true;
}
void printList(SeqList &L)//輸出順序表中元素操作
{
	for (int j = 0; j < L.n; j++)
		printf("%d\n", L.data[j]);
}

順序表的靜態存儲操作和動態存儲類似,在這裏就不在演示了。

3,順序表的應用演示:

3.1 集合的並運算,合併集合LA與LB,結果存於LA中,重複元素只留一個。

void Merge(SeqList &LA, SeqList  &LB)
{
	DataType x;
	int n = getLength(LA), m = getLength(LB), i, k;
	for (i = 0; i < m; i++)//檢查LB中所有元素
	{
		x = LB.data[i];//在LB中取第i個值
		k = Search(LA, x);//在LA中查找它
		if (k = -1)
		{
			Insert(LA, n, x);
			n++;
		}
	}
}

3.2 求順序表LA與LB中公共的元素,結果存於LA中

void Intersection(SeqList &LA, SeqList &LB)
{
	int n = getLength(LA), m = getLength(LB), i, k;
	DataType x;
	while (i <= n) {
		x = LA.data[i];
		k = Search(LB, x);
		if (k = -1) {
			remove(LA, i, x);
			n--;
		}
		else
			i++;
	}
}

謝謝大家支持,歡迎各位評論指出有哪裏不足!我會更加有動力堅持寫下去!

分享給大家一片內容相關的博文:https://blog.csdn.net/u014134180/article/details/53907607#12-%E5%8A%A8%E6%80%81%E5%AD%98%E5%82%A8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章