データ構造とアルゴリズム(III) - 基づく線形形状

                                                リニアテーブルベース

2.1  定義および線形形態の基本動作

              リニアテーブルには、注文した有限れます

              2.1.2 「」データ要素と呼ばれる一意が存在します。

              2.2.2 独自のいわゆる「最後の」データ要素が存在します。

              2.2.3 最初の要素に加えて、各要素は、固有の直接の前駆体を有します。

              2.2.4 最後の要素に加えて、各要素は一つだけ即時の後継者を持っています。

              リニアテーブル(線形リスト)である:N(N> = 0)データ要素ノード)A1、A2、...、から成る有限のシーケンス

              すべてのノードが同じデータ型を持ちます

              データ要素の数Nは、直線状の長さと呼ばれています

              場合N = 0 、と呼ばれる空の表

              場合N> 0 として表記線形、非ヌル:(A1、A2、...、AN)

              A1 ヘッドノードテーブルリニアと呼ばれる、ANは、テール・ノードと呼ばれます

              ノード値によって線形テーブルである場合又は押しキー値降順或いは昇順配列が順序付けされます

              リニアテーブルは必要な長さを増減することができる非常に柔軟なデータ構造であります

              線形フォームにアクセスすることができ、挿入および欠失のデータエレメント。

       2.2 線形形式を定義する抽象データ構造

             

LISTLENGTHは空のテーブルの演算結果か否かを判断します

Lは、空のテーブルリターンで0 そうでなければ、その長さ

       ・リニアフォームに2つのセットにLが新しいリニアフォームに表し、

              AUB = A 、線膨張テーブルLA、Bの中に存在するA 挿入要素の非存在下でLA

              ステップ:

  1. リニアテーブルからLB 各要素視聴getElem(LB、I)を- E>
  2. リニアテーブルによって値LAは:アクセスは、存在するか否かを判断するLocElem(LA、E、等しいです())
  3. 存在する場合、挿入ListInsert(LA、N + 1、 e)は、最後の位置に挿入され

      基本操作

  1. 初期LC 空のテーブル
  2. それぞれ、からLA 及びLB 現在の要素が作らBJ
  3. 場合AI <= BJ、次いでaiを中に挿入LC 、さもなければBJ に挿入された液晶媒体。
  4. 繰り返して2 および3 までのステップをLA またはLBが完成要素が取られています。
  5. LAのテーブルまたはLBは、テーブルの残りの要素にコピーLCのテーブル。

     アルゴリズム:

void MergeList(List La , List Lb , List &.Lc)
{
	InitList(Lc);	//创建空表Lc
	int i = j = 1 ;	//链表已存在,0<=i<=ListLength(L)
	int k = 0;		 
	La_len = ListLength(La);	//获取表的长度 
	Lb_len = ListLength(Lb);	
	while((i<=La_len)&&(j<=Lb_len))		//在合法的范围内操作 
	{
		GetElem(La, i , ai);			//获取链表的每个元素 
		GetElem(Lb, j , bj);
		if(ai <= bj)					//将两个表的同一个位置的 元素对比 
			ListInsert(Lc , ++k , ai);	//在从0开始的位置开始先自增再插入 
			i++;			
		else
			ListInsert(Lc , ++k , bj);
			j++;
		while( i<= la_len) 				//如果比较的元素的个数小于表的长度
		{
			GetElem(La , i++ , ai);		//获取表的后面的元素 
			ListInsert(Lc , ++k , ai);	//在Lc表后面一个个的插入 
		}
		while( j<= lb_len)
		{
			GetElem(Lb , j++ , bj);
			ListInsert(Lc , ++k , bj);
		}
	}
 }

リニアフォームを達成するために2.3

       2.3.1 順次記憶構造

       順次記憶:アドレスに連続するメモリ位置のグループの論理的な順序で格納されているリニアノードテーブル。

略称:配列表

       ・物理的な順序と一致フォーム線形論理的順序。

       ・データ要素間の関係を達成するために、コンピュータで「隣接物理的な場所」の要素であります      

第一のリニアフォームIの格納先要素である、LOC(AI)I + 1 位置であるLOC(+ 1 AI)= LOC (AI)+ L

LOC(+ 1 AI)= LOC(A1)+(I-1)* L

       2.3.2 アクセス構造:アクセス構造は、データ構造の時間的パフォーマンスルック・ルックアップの説明であります

              ランダム記憶構造:性能は、ルックアップデータ構造内の時間を指すO(N) すなわち、データ要素の時間複雑さを見つける構造の要素の位置に関連した、直鎖状であります

              ・単一のリストには、シーケンシャルアクセス構造です。

       ランダムシーケンステーブルを有する特性記憶アレイはまた、プロパティは、テーブルの直線長さ、注文テーブルのタイプを定義する構造タイプを有するべきであることを示しています。

  1. 静的構造:テーブルがいっぱいになったら、あなたは展開できません
/*静态顺序表的定义*/
#define MaxSize 50
typedef struct{
	ElemType data[MaxSize];		//定义顺序表的元素 
	int length;			//当前长度 
}SqList; 				//顺序表的类型 
  1. 動的な構造は:拡張することができ、新しいサイズのデータがメンバーに含まmaxSizeの中を
  2. #define InitSize 100
    typedef struct{
    	ElemType *data;			//指示动态分配数组的指针 
    	int MaxSize, length;	//数组的最大容量和当前长度 
    }SeqList; 			//动态分配数组顺序表类型
    
    具体的にCRUD操作を実装します:
    /*在顺序表的第i个位置插入元素*/ 
    bool ListInsert(SqList &L, int i, ElemType e)
    {	if(i<1||i>L.length+1)
    		return false;
    	if(L.length>=MaxSize)
    		return false;
    	for(int j=L.length;j>=i;j--)
    		L.data[j]=L.data[j-1];	//位置后移 
    	L.data[i-1]=e;		//在后移的第一个位置前的位置赋值 
    	L.length++;			//长度+1 
    	return true;	}
    /*删除顺序表第i个位置的元素并将被删除的元素用引用变量e返回*/
    bool ListDelete(SqList &L, int i , ElemType &e)
    {
    	if(i<1||i>L.length)
    		return false;
    	e = L.data[i-1];	//第i个位赋值e
    	for(int j = i;j<L.length;j++)	//从插入的位置开始
    	{
    		L.data[j-1] = L.data[j];	//后面所有的元素前移
    	}
    	L.length--;
    	return true;
    }
    
    /*查找线性表中值为e的元素并返回位置*/
    int LocateElem(SqList L , ElemType e)
    {
    	int i;
    	for(i=0;i<L.length;i++)	//依次遍历
    	{
    		if(L.data[i]==e)	//判断是否是e
    			return i+1;	//返回其位序
    	}
    	return 0;
    }
    /**删除顺序表中最小值,由最后的元素填补这个位置**/
    bool Del_Min(sqList &L , ElemType &value)
    {
    	if(L.length == 0)
    		return false;
    	value = L.data[0];
    	int pos = 0;
    	for(int i = 1; i<L.length; i++)
    		if(L.data[i]<value)
    		{
    			value = L.data[i];
    			pos = i;
    		}
    	L.data[pos] = L.data[L.length - 1];
    	L.length--;
    	return true; 
    }
    

     

 

 

 

 

 

公開された58元の記事 ウォン称賛31 ビュー40000 +

おすすめ

転載: blog.csdn.net/qq_37504771/article/details/104261406