資料結構與演算法分析記錄 基本資料結構

2021-08-28 05:46:26 字數 3546 閱讀 5377

單鏈表

struct node

;//找到某一元素

position find(elementtype x,list list)

}//刪除某一元素

void delete(elementtype x,list l)

}//找到目標元素前的元素

position findprevious(elementtype x,list l)

//插入元素

void insert(elementtype x,list l,position p)

//刪除鍊錶的方法

void deletelist(list l)

}

雙鏈表:雙鏈表為了便於倒序掃瞄,在資料結構中增加了乙個指向前一單元的指標;

迴圈鍊錶:讓最後的單元反過來指向第乙個單元;

例項一:多項式相加

例項二:基數排序

游標法實現鍊錶:因為有很多語言不支援指標;

模仿指標特點的關鍵:

限制插入和刪除只能在乙個位置上進行的表,基本操作是push和pop,先進後出表;

實現棧結構--指標法

struct node;

typedef struct node *ptrtonode;

typedef ptrtonode stack;

struct node

//建立乙個表,返回指標的表

stack createstack()

void push(elementtype x,stack s) }

void pop(stack s)

}//返回棧頂元素

elementtype top(stack s)

棧結構--陣列法

為了避免指標也許是更流行的方案--缺點(需要提前宣告乙個陣列的大小),但是問題不大,因為任意時刻棧元素的實際個數不會太大。

例項一:符號平衡-檢測符號有沒有出錯

思路:為了實現符號平衡,先建立乙個空棧,先讀入一對符號的左邊,直到讀入這對符號的郵編,把符號彈出,如果這對符號對稱則繼續,直到所有符號讀完並且棧為空;

struct node

;typedef struct node node;

typedef struct node* stack;

typedef struct node* position;

stack makestack(void)

}int isempty(stack s)

void push(stack s,char x)

}void pop(stack s)

}char top(stack s)

int match(char p,char q)

else if(abs(p-q)==2)

return 1;

else

return 0;

}void checksymbols(stack s)

'||ch==']'||==ch==')')

else

} }if(isempty(s))

printf("right\n");

}int main(int argc,char *argv)

struct queuerecord;

typedef struct queuerecord * queue;

typedef double elementtype;

struct queuerecord

;queue creatqueue(int maxelements)

static int suc(int value,queue q)

//入隊是處理隊尾rear

void enqueue(elementtype x,queue q)

int isfull(queue q)

int isempty(queue q)

//出隊是處理隊頭front

void dequeue(queue q)

else

}elementtype frontanddequeue(queue q)

else

}void disposequeue(queue q)

對於大量的輸入資料,鍊錶的線性訪問時間太慢,不宜使用。樹的平均操作時間為o(logn);

//樹的實現

#define stackmaxsize 10定義棧陣列的長度

typedef char elemtype;

struct btreenode

;//按照廣義表輸入

void createbtree(struct btreenode** bt,char* string)

top++;

s[top]=p;

k=1;

break;

}case')':

case',':k=2;break;

default:

}} i++; }}

//求深度

int btreedepth(struct btreenode* bt)

}//從二叉樹中查詢為x的節點

elemtype* findtree()

}}

二叉查詢數:性質-對於樹中的每個節點x,它的左子樹中所有的關鍵字值小於x的關鍵字的值,而它右子樹所有關鍵字的值大於x的值;

//二叉查詢樹

struct treenode;

typedef struct treenode *position;

typedef struct treenode *searchtree;

struct treenode

//查詢樹find

position find(elementype x,searchtree t)

else

}//找到最小的值:遞迴

position findmin(searchtree t)

}//找到最大的值:非遞迴

position findmax(searchtree t)

return t;

}//插入操作

searchtree insert(elementype x,searchtree t)

} else

else if(x>t->element)

else

return t;

}}

二叉查詢樹節點刪除:

解決衝突的簡單方法--分離鏈結法和開放定址法;

演算法 基本資料結構

1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...

基本資料結構與演算法 之陣列

1.mxn的矩陣,若某個元素值為0,則將其所在的行和列全置為0。定義行陣列rows,列陣列cols。如果a i j 為0,則將rows i 和cols j 置為true。當遍歷完整個a陣列後,根據rows和cols的值對矩陣進行修改。2.陣列a,將a 0 a p 和a p 1 a n 1 這兩段交換...

資料結構與演算法一 基本資料結構及演算法總體設計思路

資料結構的儲存方式其實只有陣列和鍊錶兩種,別的資料結構例如佇列 棧 樹 圖 堆及雜湊表都是基於以上兩種方式實現的。陣列的優點在於可以隨機訪問,但是插入刪除時需要解決擴容縮容的問題 鍊錶的優點在於可以高效插入刪除,但是無法隨機訪問。資料結構的基本操作主要為增刪改查,其本質是遍歷 訪問。設計不同的資料結...