数据结构中部分算法的代码or伪代码实现
线性表
顺序表
存储
1 2 3 4 5 6
| #define MAXSIZE 100 typedef struct { ElemType *elem; int length; }SqList;
|
初始化
1 2 3 4 5 6 7
| Status InitList_Sq(SqList &L) { L.elem= (ElemType*)malloc(MAXSIZE * sizeof(ElemType)); if(!L.elem) exit(OVERFLOW); L.length=0; return OK; }
|
取值
取第i个元素,随机存取。
1 2 3 4 5 6 7
| int GetElem(SqList L,int i,ElemType &e) { if (i<1||i>L.length) return ERROR; e=L.elem[i-1]; return OK; }
|
查找
1 2 3 4 5 6
| int LocateELem(SqList L,ElemType e) { for (i=0;i< L.length;i++) if (L.elem[i]==e) return i+1; return 0; }
|
插入
1 2 3 4 5 6 7 8 9 10 11
| Status ListInsert_Sq(SqList &L,int i ,ElemType e) { if(i<1 || i>L.length+1) return ERROR; if(L.length==MAXSIZE) return ERROR; for(j=L.length-1;j>=i-1;j--) L.elem[j+1]=L.elem[j]; L.elem[i-1]=e; ++L.length; return OK; }
|
删除
1 2 3 4 5 6 7 8
| Status ListDelete_Sq(SqList &L,int i) { if((i<1)||(i>L.length)) return ERROR; for (j=i;j<=L.length-1;j++) L.elem[j-1]=L.elem[j]; --L.length; return OK; }
|
链表
存储
1 2 3 4 5
| typedef struct Lnode { ElemType data; struct LNode *next; }LNode,*LinkList;
|
初始化
1 2 3 4 5
| Status InitList_L(LinkList &L){ L=new LNode; L->next=NULL; return OK; }
|
取值
1 2 3 4 5 6 7 8 9
| Status GetElem_L(LinkList L,int i,ElemType &e){ p=L->next;j=1; while(p&&j<i){ p=p->next; ++j; } if(!p || j>i)return ERROR; e=p->data; return OK; }
|
查找
1 2 3 4 5 6 7
| LNode *LocateELem_L (LinkList L,Elemtype e) { p=L->next; while(p &&p->data!=e) p=p->next; return p; }
|
插入
1 2 3 4 5 6 7 8 9 10
| Status ListInsert_L(LinkList &L,int i,ElemType e){ p=L;j=0; while(p&&j<i−1){p=p->next;++j;} if(!p||j>i−1)return ERROR; s=new LNode; s->data=e; s->next=p->next; p->next=s; return OK; }
|
删除
1 2 3 4 5 6 7 8 9 10 11 12 13
| Status ListDelete_L(LinkList &L,int i,ElemType &e){ p=L;j=0; while(p->next &&j<i-1){ p=p->next; ++j; } if(!(p->next)||j>i-1) return ERROR; q=p->next; p->next=q->next; e=q->data; delete q; return OK; }
|
创建
头插法
1 2 3 4 5 6 7 8 9
| void CreateList_H(LinkList &L,int n){ L=new LNode; L->next=NULL; for(i=0;i<n;i++){ p=new LNode; cin>>p->data; p->next=L->next;L->next=p; } }
|
尾插法
1 2 3 4 5 6 7 8 9 10 11
| void CreateList_R(LinkList &L,int n){ L=new LNode; L->next=NULL; r=L; for(i=0;i<n;i++){ p=new LNode; cin>>p->data; p->next=NULL;r->next=p; r=p; } }
|
双向链表
插入
1 2 3 4 5 6 7 8 9 10
| Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){ if(!(p=GetElemP_DuL(L,i))) return ERROR; s=new DuLNode; s->data=e; s->prior=p->prior; p->prior->next=s; s->next=p; p->prior=s; return OK; }
|
删除
1 2 3 4 5 6 7 8 9
| Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e) { if(!(p=GetElemP_DuL(L,i))) return ERROR; e=p->data; p->prior->next=p->next; p->next->prior=p->prior;/ delete p; return OK; }
|
栈和队列
栈
顺序栈
1 2 3 4 5 6 7
| #define MAXSIZE 100 typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack;
|
初始化
1 2 3 4 5 6 7 8
| Status InitStack( SqStack &S ) { S.base =new SElemType[MAXSIZE]; if( !S.base ) return OVERFLOW; S.top = S.base; S.stackSize = MAXSIZE; return OK; }
|
进出
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Status Push( SqStack &S, SElemType e) { if( S.top - S.base== S.stacksize ) return ERROR; *S.top++=e; return OK; } Status Pop( SqStack &S, SElemType &e) { if( S.top == S.base ) return ERROR; e= *--S.top; return OK; }
|
取栈顶元素
1 2 3 4 5 6
| Status GetTop( SqStack S, SElemType &e) { if( S.top == S.base ) return ERROR; e = *( S.top – 1 ); return OK; }
|
链栈
1 2 3 4 5
| typedef struct StackNode { SElemType data; struct StackNode *next; } StackNode, *LinkStack; LinkStack S;
|
初始化
1 2 3 4
| void InitStack(LinkStack &S ) { S=NULL; }
|
进出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Status Push(LinkStack &S , SElemType e) { p=new StackNode; if (!p) exit(OVERFLOW); p->data=e; p->next=S; S=p; return OK; } Status Pop (LinkStack &S,SElemType &e) { if (S==NULL) return ERROR; e = S-> data; p = S; S = S-> next; delete p; return OK; }
|
取栈顶元素
1 2 3 4 5
| SElemType GetTop(LinkStack S) { if (S==NULL) exit(1); else return S–>data; }
|
队列
循环队列
1 2 3 4 5 6
| #define MAXQSIZE 100 Typedef struct { QElemType *base; int front; int rear; }SqQueue;
|
初始化
1 2 3 4 5 6
| Status InitQueue (SqQueue &Q){ Q.base =new QElemType[MAXQSIZE] if(!Q.base) exit(OVERFLOW); Q.front=Q.rear=0; return OK; }
|
求长度
1 2 3
| int QueueLength (SqQueue Q){ return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; }
|
进出
1 2 3 4 5 6 7 8 9 10 11 12
| Status EnQueue(SqQueue &Q,QElemType e){ if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; return OK; } Status DeQueue (LinkQueue &Q,QElemType &e){ if(Q.front==Q.rear) return ERROR; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAXQSIZE; return OK; }
|
链队列
1 2 3 4 5 6 7 8
| typedef struct QNode{ QElemType data; struct Qnode *next; }Qnode, *QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue;
|
初始化
1 2 3 4 5 6
| Status InitQueue (LinkQueue &Q){ Q.front=Q.rear=(QueuePtr) malloc(sizeof(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next=NULL; return OK; }
|
取队头
1 2 3 4 5
| Status GetHead (LinkQueue Q, QElemType &e){ if(Q.front==Q.rear) return ERROR; e=Q.front->next->data; return OK; }
|
进出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Status EnQueue(LinkQueue &Q,QElemType e){ p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; } Status DeQueue (LinkQueue &Q,QElemType &e){ if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear=Q.front; delete p; return OK; }
|
表达式求值
串&数组&广义表
BF算法
1 2 3 4 5 6 7 8
| int Index(Sstring S,Sstring T,int pos){ i=pos; j=1; while (i<=S[ 0 ] && j <=T[ 0 ]){ if ( S[ i ]=T[ j ]) {++i; ++j; } else{ i=i-j+2; j=1; } if ( j>T[ 0 ]) return i-T[0]; else return 0; }
|
广义表的递归
树
二叉链表
1 2 3 4 5
| typedef struct BiNode{ TElemType data; struct BiNode *lchild,*rchild; }BiNode,*BiTree;
|
二叉树遍历
先中后遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| Status PreOrderTraverse(BiTree T){ if(T==NULL) return OK; else{ cout<<T->data; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); } } Status InOrderTraverse(BiTree T){ if(T==NULL) return OK; else{ InOrderTraverse(T->lchild); cout<<T->data; InOrderTraverse(T->rchild); } } Status PostOrderTraverse(BiTree T){ if(T==NULL) return OK; else{ PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout<<T->data; } }
void CreateBiTree(BiTree &T){ cin>>ch; if (ch==’#’) T=NULL; else{ T=new BiTNode; T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } }
|
计算二叉树结点总数
1 2 3 4
| int NodeCount(BiTree T){ if(T == NULL ) return 0; else return NodeCount(T->lchild)+NodeCount(T->rchild)+1; }
|
计算二叉树叶子结点总数
1 2 3 4 5 6 7
| int LeadCount(BiTree T){ if(T==NULL) return 0; if (T->lchild == NULL && T->rchild == NULL) return 1; else return LeafCount(T->lchild) + LeafCount(T->rchild); }
|
计算二叉树的深度
1 2 3 4 5 6 7 8 9
| int TreeDepth(BiTree T){ int hl,hr,max; if(T){ hl=TreeDepth(T->lchild); hr=TreeDepth(T->rchild); return max{hl,hr}+1;/ } else return 0; }
|
哈夫曼树
1 2 3 4
| typedef struct { int weight; int parent,lch,rch; }*HTNode,*HuffmanTree;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void CreatHuffmanTree (HuffmanTree HT,int n){ if(n<=1)return; m=2*n-1; HT=new HTNode[m+1]; for(i=1;i<=m;++i) {HT[i].lch=0;HT[i].rch=0;HT[i].parent=0;} for(i=1;i<=n;++i)cin>>HT[i].weight; for( i=n+1;i<=m;++i) { Select(HT,i-1, s1, s2); HT[s1].parent=i; HT[s2].parent=i; HT[i].lch=s1; HT[i].rch=s2 ; HT[i].weight=HT[s1].weight + HT[s2] .weight; } } }
|
其他
求树的遍历,深度,转换镜像,判断对称,结点的前驱后继
图
存储
邻接矩阵
1 2 3 4 5
| typedef struct{ VerTexType vex[MVNum]; ArcType arcs[MVNum][MVNum]; int vexnum,arcnum; }MGraph;
|
邻接表
1 2 3 4 5 6 7 8 9 10 11 12
| typedef struct ArcNode{ int adjvex; struct ArcNode * nextarc; }ArcNode; typedef struct VNode{ VerTexType data; ArcNode * firstarc; }VNode,AdjList[MVNum]; typedef struct{ AdjList vertices; int vexnum,arcnum; }LGraph;
|
创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| int LocateVex(MGraph G,VertexType u) { int i; for(i=0;i<G.vexnum;++i) if(u==G.vexs[i]) return i; return -1; } Status CreateUDN(AMGraph &G){ cin>>G.vexnum>>G.arcnum; for(i = 0; i<G.vexnum; ++i) cin>>G.vexs[i]; for(i = 0; i<G.vexnum;++i) for(j = 0; j<G.vexnum;++j) G.arcs[i][j] = MaxInt; for(k = 0; k<G.arcnum;++k){ cin>>v1>>v2>>w; i = LocateVex(G, v1); j = LocateVex(G, v2); G.arcs[i][j] = w; G.arcs[j][i] = G.arcs[i][j]; } return OK; } Status CreateUDG(ALGraph &G){ cin>>G.vexnum>>G.arcnum; for(i = 0; i<G.vexnum; ++i){ cin>> G.vertices[i].data; G.vertices[i].firstarc=NULL; } for(k = 0; k<G.arcnum;++k){ cin>>v1>>v2; i = LocateVex(G, v1); j = LocateVex(G, v2); p1=new ArcNode; p1->adjvex=j; p1->nextarc= G.vertices[i].firstarc; G.vertices[i].firstarc=p1; p2=new ArcNode; p2->adjvex=i; p2->nextarc= G.vertices[j].firstarc; G.vertices[j].firstarc=p2; } return OK; }
|
遍历
深度优先
仿树的先序遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void DFS(AMGraph G,int v){ cout<<v; visited[v]=true; for(w=0;w<G.vexnum;w++) if((G.arcs[v][w]!=0)&&(!visited[w])) DFS(G,w); } void DFS(ALGraph G, int v){ cout<<v; visited[v] = true; p= G.vertices[v].firstarc; while(p!=NULL){ w=p->adjvex; if(!visited[w]) DFS(G, w); p=p->nextarc; } }
|
广度优先
仿树的层次遍历
1 2 3 4 5 6 7 8 9 10 11 12 13
| void BFS (Graph G, int v){ cout<<v; visited[v] = true; InitQueue(Q); EnQueue(Q, v); while(!QueueEmpty(Q)){ DeQueue(Q, u); for(w = FirstAdjVex(G, u); w>=0; w = NextAdjVex(G, u, w)) if(!visited[w]){ cout<<w; visited[w] = true; EnQueue(Q, w); } } }
|
最短路径
最小生成树
查找
顺序查找
1 2 3 4 5
| int Search_Seq(SSTable ST,KeyType key){ ST.R[0].key=key; for(i=ST.length;ST.R[i].key!=key;--i); return i; }
|
折半查找
1 2 3 4 5 6 7 8 9 10 11
| int Search_Bin(SSTable ST,KeyType key) { low=1;high=ST.length; while(low<=high){ mid=(low+high)/2; if(key==ST.R[mid].key) return mid; else if(key<ST.R[mid].key) high=mid-1; else low=mid+1; / } return 0; }
|
递归算法?
二叉排序树
1 2 3 4 5 6
| BSTree SearchBST(BSTree T,KeyType key) { if((!T) || key==T->data.key) return T; else if (key<T->data.key) return SearchBST(T->lchild,key); else return SearchBST(T->rchild,key); }
|
插入
除留余数法
排序
插入排序
直接插入排序
1 2 3 4 5 6 7 8 9 10 11 12
| void InsertSort(SqList &L) { int i,j; for(i=2;i<=L.length;++i) if( L.r[i].key<L.r[i-1].key) { L.r[0]=L.r[i]; L.r[i]=L.r[i-1]; for(j=i-2; L.r[0].key<L.r[j].key;--j) L.r[j+1]=L.r[j]; L.r[j+1]=L.r[0]; } }
|
折半插入排序
1 2 3 4 5 6 7 8 9 10 11 12
| void BInsertSort ( SqList &L ) { for ( i = 2; i <= L.length ; ++i ) { L.r[0] = L.r[i]; low = 1 ; high = i-1 ; while ( low <= high ) { m = ( low + high ) / 2 ; if ( L.r[0].key < L.r[m]. key ) high = m -1 ; else low = m + 1; } for ( j=i-1; j>=high+1; - - j ) L.r[j+1] = L.r[j]; L.r[high+1] = L.r[0]; } }
|
希尔排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void ShellInsert(SqList &L,int dk) { for(i=dk+1;i<=L.length; ++ i) if(r[i].key < r[i-dk].key) { r[0]=r[i]; for(j=i-dk; j>0 &&(r[0].key<r[j].key); j=j-dk) r[j+dk]=r[j]; r[j+dk]=r[0]; } } void ShellSort(SqList &L,int dlta[ ],int t){ for(k=0;k<t;++k) ShellInsert(L,dlta[k]); }
|
交换排序
起泡排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void bubble_sort(int arr[]) { for(i=0;i<arr.len-1;i++) for(j=0;j<arr.len-1-i;j++) if(arr[j]>arr[j+1]) swap(arr[j],arr[j+1]); }
void bubble_sort(SqList &R) { int flag=1; for(i=1;i<n;i++){ if(!flag) break; flag=0; for(j=1;j<n;j++){ if(R[j].key>R[j+1].key){ flag=1; swap(R[j].key,R[j+1].key); } } }
|
快速排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int Partition ( SqList &L,int low,int high ) { L.r[0] = L.r[low]; pivotkey = L.r[low].key; while ( low < high ) { while ( low < high && L.r[high].key >= pivotkey ) --high; L.r[low] = L.r[high]; while ( low < high && L.r[low].key <= pivotkey ) ++low; L.r[high] = L.r[low]; } L.r[low]=L.r[0]; return low; }
void QSort ( SqList &L,int low,int high ) { if ( low < high ) { pivotloc = Partition(L, low, high ) ; Qsort (L, low, pivotloc-1) ; Qsort (L, pivotloc+1, high ) } }
|
选择排序
简单选择排序
1 2 3 4 5 6 7 8 9 10
| void SelectSort(SqList &K) { for (i=1; i<L.length; ++i) { k=i; for( j=i+1;j<=L.length ; j++) if ( L.r[j].key <L.r[k].key) k=j; if(k!=i) swap(L.r[i],L.r[k]); } }
|
堆排序