單鏈表
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 這兩段交換...
資料結構與演算法一 基本資料結構及演算法總體設計思路
資料結構的儲存方式其實只有陣列和鍊錶兩種,別的資料結構例如佇列 棧 樹 圖 堆及雜湊表都是基於以上兩種方式實現的。陣列的優點在於可以隨機訪問,但是插入刪除時需要解決擴容縮容的問題 鍊錶的優點在於可以高效插入刪除,但是無法隨機訪問。資料結構的基本操作主要為增刪改查,其本質是遍歷 訪問。設計不同的資料結...