期末了,赶紧复习一波,手打一份书上的代码以便随时查阅


第二章:

  1. //顺序表存储结构
  2. #define MAXSIZE 100
  3. typedef struct
  4. {
  5. Elemtype *elemt;
  6. int length;
  7. }Sqlist;
  8. Status InitList(Sqlist &L)
  9. {
  10. L.elemt=new Elemtype[MAXSIZE];
  11. if(!L.elemt) exit(OVERFLOW);
  12. // L.length=MAXQSIZE;
  13. L.length=0;
  14. return OK;
  15. }
  16. Status GetElemt(Sqlist &L,int i,Elemtype &e)
  17. {
  18. if(i<1||i>L.length) return ERROR;
  19. // [错了]e=L->elemt[i];
  20. e=L->elemt[i-1];
  21. return OK;
  22. }
  23. Status LocateElem(Sqlist &L,Elemtype e)
  24. {
  25. for(i=0;i<L.length;++i)
  26. {
  27. if(L.elemt[i]==e) return i+1;
  28. }
  29. return 0;
  30.  
  31. }
  32. //Status SearchElemt(Sqlist &L,int &j,Elemtype e)
  33. //{
  34. // if(j<1||j>L.length) return ERROR;
  35. // for(int i=0;i<L.length;++i)
  36. // if(L.elemt[i]==e)
  37. // {
  38. // j=i+1;
  39. // return OK;
  40. // }
  41. // return ERROR;
  42. //}
  43. Status ListInsert(Sqlist &L ,int i,Elemtype e)
  44. {
  45. if(i<1||i>L.length) return ERROR;//忘记了
  46. if(L.length==MAXSIZE)return ERROR;//又忘记了
  47. for(j=L.length-1;j>=i-1;--j)
  48. {
  49. L.elemt[j+1]=L.elemt[j];
  50. }
  51. L.elemt[i-1]=e;
  52. L.length++;
  53. return OK;
  54. }
  55.  
  56. Status ListDelete(Sqlist &L,int i)
  57. {
  58. if(i<1||i>L.length) return ERROR;//忘了
  59. // for(j=i-1;j<L.length-1;++j)
  60. // {
  61. // L.elemt[j]=L.elemt[j+1];
  62. // }
  63. for(j=i;j<=L.length-1;++j)
  64. L.elemt[j-1]=L.elemt[j];
  65. L.length--;
  66. return OK;
  67. }
  68. //单链表的存储
  69. typedef struct LNode
  70. {
  71. ElemType data;
  72. struct LNode * next;
  73. }LNode,*Linklist;
  74.  
  75. Status InitLink(Linklist &L)
  76. {
  77. L=new LNode;
  78. // if(!L) exit(OVERFLOW);
  79. L->next=NULL;
  80. return OK;
  81. }
  82. //单链表的取值
  83. Status GetElemt(Linklist &L,int i,Elemtype &e)
  84. {
  85. p=L->next;
  86. j=1;
  87. while(p&&j<i)
  88. {
  89. p=p->next;++j;
  90. }
  91. if(!p||j>i) return ERROR;
  92. e=p->data;
  93. return OK;
  94. }
  95. //单链表的按值查找
  96. LNode LocateElem(Linklist &L,Elemtype e)
  97. {
  98. p=L->next;j=1;
  99. // while(p->data!=e)
  100. // {
  101. // p=p->next;
  102. // }
  103. // return p;
  104. while(p&&p->data!=e)
  105. p=p->next;
  106. return p;
  107. }
  108. //单链表的插入
  109. Status ListInsert(Linklist &L,int i,Elemtype e)
  110. {
  111. // p=L->next;j=1;
  112. p=L;j=0;
  113. while(p&&j<i-1)
  114. {
  115. p=p->next;++j;
  116. }
  117. if(!p||j>i-1) return ERROR;
  118. s=new LNode;
  119. s->data=e;
  120. s->next=p->next;
  121. p->next=s;
  122. return OK;
  123. }
  124. //删除
  125. Status DeleteElemt(Linklist &L,int i)
  126. {
  127. p=L;j=0;
  128. while(p->next&&j<i-1)
  129. {
  130. p=p->next;++j;
  131. }
  132. if(!p->next||j>i-1) return ERROR;
  133. s=p->next;
  134. p->next=s->next;
  135. delete s;
  136. return OK;
  137. }
  138. //单链表的创建--前插
  139. void CreateList_H(Linklist &L,int n)
  140. {
  141. L=new LNode;
  142. L->next=NULL;
  143. for(i=-0;i<n;++i)
  144. {
  145. p=new LNode;
  146. cin>>p->data;
  147. p->next=L->next;
  148. L->next=p;
  149. }
  150. }
  151. //单链表的创建——尾插
  152. void CreateList_T(Linklist &L,int n)
  153. {
  154. L=new LNode;
  155. L->next=NULL;
  156. r=L;
  157. for(i=0;i<n;i++)
  158. {
  159. p=new LNode;
  160. cin>>p->data;
  161. p->next=NULL;
  162. r->next=p;
  163. r=p;
  164. }
  165. }
  166. //双向链表
  167. typedef struct DuLNode
  168. {
  169. Elemtype data;
  170. struct DuLNode *ptr;
  171. struct DuLNode *next;
  172. }DulNode,*DuLinkList;
  173. //双向链表的插入
  174. Status ListInsert_Dul(DuLinkList &Lint i,Elemtype e)
  175. {
  176.  
  177. // p=L;j=1;
  178. // while(p&&j<i-1)
  179. // {
  180. // p=p->next;++j;
  181. // }
  182. // if(!p||j>i-1) return ERROR;
  183. //
  184. // s=new DulNode;
  185. // s->data=e;
  186. // s->next=p->next;
  187. // s->ptr=p->ptr;
  188. // p->next->ptr=s;
  189. // p->next=s;
  190. if(!(p=GetElem_Dul(L,i)))
  191. return ERROR;
  192. s=new LNode;
  193. s->data=e;
  194. s->ptr=p->ptr;
  195. s->next=p;
  196. p->ptr->next=s;
  197. p->ptr=s;
  198. return OK;
  199. }
  200. //双向链表的删除
  201. Status ListDelete_Dul(Linklist &L,int i)
  202. {
  203. if(!(p=GetElemt_Dul(L,i)))
  204. return ERROR;
  205. p->next->ptr=p->ptr;
  206. p->ptr->next=p->next;
  207. delete p;
  208. return OK;
  209. }

  第三章:

  1. #define MAXSIZE
  2. typedef struct
  3. {
  4. SElemtTpye *base;
  5. SElemtTpye *top;
  6. int stacksize;
  7. }SqStack ;
  8.  
  9. Status InitStack(SqStack &S)
  10. {
  11. S.base=new SElemtTpye[MAXSIZE];
  12. // [危阻]if(!S.basa)return ERROR;
  13. if(!S.base) exit(OVERFLOW);
  14. S.top=S.base;
  15. S.stacksize=MAXSIZE;
  16. return OK;
  17. }
  18.  
  19. Status Push(SqStack &S,SElemtTpye e)
  20. {
  21. if(S.top-S.base==S.stacksize) return ERROR;
  22. *S.top=e;
  23. S.top++;
  24. // S.stacksize++;
  25. return OK;
  26. }
  27.  
  28. Status Pop(SqStack &S,SElemtTpye &e)
  29. {
  30. if(S.top==S.base) return ERROR;
  31. S.top--;
  32. e=*S.top;
  33. // S.stacksize--;
  34. return Ok;
  35. }
  36.  
  37. SElemtTpye GetTop(SqStack &S)
  38. {
  39. if(S.top==S.base) return ERROR;
  40. // S.top--;
  41. // return *S.top;
  42. return *(S.top-1);
  43. }
  44. //全媚
  45.  
  46. typedef struct StackNode
  47. {
  48. struct StackNode *next;
  49. ElemtTpye data;
  50. }StackNode,*LinkStack;
  51.  
  52. Status InitStack(LinkStack &S)
  53. {
  54. S=NULL;
  55. return OK;
  56. // S=new StackNode;
  57. // if(!S) return ERROR;
  58. // S.next=NULL;
  59. // return OK;
  60. }
  61. Status Push(LinkStack &S,ElemtTpye e)
  62. {
  63. p=new StackNode;
  64. if(!p) return ERROR;
  65. p->data=e;
  66. p->next=S;
  67. S=p;
  68. return OK;
  69. }
  70.  
  71. Status Pop(LinkStack &S,ElemtTpye &e)
  72. {
  73. if(!S)return ERROR;
  74. e=S.data;
  75. p=S;
  76. S=S->next;
  77. delete p;//梨芝瞥慧阻
  78. return OK;
  79. }
  80.  
  81. ElemtTpye GetTop(LinkStack &S)
  82. {
  83. if(!S) return ERROR;
  84. return S->data;
  85. }
  86.  
  87. #define MAXQSIZE 100
  88. typedef struct
  89. {
  90. QElemtype *base;
  91. int front;
  92. int rear;
  93. }SqQueue;
  94.  
  95. Status InitQueue(SqQueue &Q)
  96. {
  97. Q.base=new QElemtype[MAXQSIZE];
  98. if(!Q.base) exit(OVERFLOW);
  99. Q.front=Q.rear=0;
  100. return OK;
  101. }
  102. Status EnQueue(SqQueue &Q,Elemtype e)
  103. {
  104. if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
  105. Q.base[Q.rear]=e;
  106. Q.rear=(Q.rear+1)%MAXQSIZE;
  107. return OK;
  108. }
  109.  
  110. Status DeQueue(SqQueue &Q,Elemtype &e)
  111. {
  112. if(Q.rear==Q.front) return ERROR;
  113. e=Q.base[Q.front];
  114. Q.front=(Q.front+1)%MAXQSIZE;
  115. return OK;
  116. }
  117.  
  118. Elemtype GetTop(SqQueue &Q)
  119. {
  120. if(Q.front==Q.base) return ERROR;
  121. return Q.base[Q.front];
  122. }
  123. //全錦
  124. typedef struct QNode
  125. {
  126. Elemtype data;
  127. struct QNode *next;
  128. }QNode,*QueuePtr;
  129. typedef struct
  130. {
  131. QueuPtr front;
  132. QueuePtr rear;
  133. }*LinkQueue;
  134.  
  135. Status InitQueue(LinkQueue &Q)
  136. {
  137. Q.front=Q.rear=new QNode;
  138. Q.front->next=NULL;
  139. return OK;
  140. }
  141.  
  142. Status EnQueue(LinkQueue &Q,Elemtype e)
  143. {
  144. p=new QNode;
  145. p->data=e;
  146. p->next=NULL;
  147. Q.rear->next=p;
  148. Q.rear=p;
  149. return OK;
  150. }
  151. Status DeQueue(LinkQueue &Q,Elemtype &e)
  152. {
  153. if(Q.front==Q.rear)return ERROR;
  154. p=Q.front->next;
  155. e=p->data;
  156. Q.front->next=p->next;
  157. if(p==Q.rear) Q.rear=Q.front;
  158. delete p;
  159. return OK;
  160. }

  第四章:

  1. //串的顺序定义
  2. #define MAXSIZE 100
  3. typedef struct
  4. {
  5. char ch[MAXSIZE];
  6. int length;
  7. }SString;
  8. //串的链式定义--完全没记住Orz
  9. //typedef struct a
  10. //{
  11. // char ch[MAXQSIZE];
  12. // int length;
  13. // struct a * next;
  14. //}*c;
  15. //typedef struct
  16. //{
  17. // c
  18. //}LString;
  19. #define CHUNKSIZE 100
  20. typedef struct Chunk
  21. {
  22. char ch[CHUNKSIZE];
  23. struct Chunk * next;
  24. }Chunk;
  25. typedef struct
  26. {
  27. Chunk *head,*tail;
  28. int length;
  29.  
  30. }LString;

第五章:

  1. //二叉树的顺序存储结构
  2. #define MAXTSIZE 100
  3. typedef TElemtype SqBiTree[MAXSIZE];
  4. SqBiTree Bt;
  5. //二叉树的链式存储表示
  6. typedef struct BiTNode
  7. {
  8. Elemtype data;
  9. struct BiTNode * rchild,*lchrild;
  10. }BiTNode,*BiTree;
  11. //中序遍历的递归算法
  12. void InOrderTraverse(BiTree &T)
  13. {
  14. if(T)
  15. {
  16. InOrderTraverse(T->lchild);
  17. cout<<T->data;
  18. InOrderTraverse(T->rchild);
  19. }
  20. }
  21. //先序遍历的顺序建立二叉链表
  22. void CreateBiTree(BiTree &T)
  23. {
  24. cin>>ch;
  25. if(ch=='#')
  26. {
  27. T=NULL;
  28. }
  29. else
  30. {
  31. T=new BiNode;
  32. T->data=ch;
  33. CreateBiTree(T->lchild);
  34. CreateBiTree(T->rchild);
  35. }
  36. }
  37. //复制二叉树
  38. void Copy(BiTree &T,Bi &NewT)
  39. {
  40. if(!T)
  41. {
  42. NewT=NULL;
  43. return;
  44. }
  45. else
  46. {
  47. NewT=new BiNode;
  48. NewT->data=T->data;
  49. Copy(T->lchild,NewT->lchild);
  50. Copy(T->rchild,NewT->rchild);
  51. }
  52. }
  53. //计算二叉树深度
  54. void Depth(BiTree &T)
  55. {
  56. if(!T) return 0;
  57. else
  58. {
  59. m=Depth(T->lchild);
  60. n=Depth(T->rchild);
  61. if(m>n)
  62. {
  63. return m+1;
  64. }
  65. else
  66. {
  67. return n+1;
  68. }
  69. }
  70. }
  71. //统计二叉树结点个数
  72. int NodeCount(BiTree &T)
  73. {
  74. if(!T) return 0;
  75. else
  76. {
  77. return NodeCount(T->rchild)+NodeCount(T->lchild)+1;
  78. }
  79. }
  80. //二叉树的二叉线索存储表示
  81. typedef struct BiThrNode
  82. {
  83. Elemtype data;
  84. struct BiThrNode *lchild,*rchild;
  85. int ltag,rtag;
  86. }BiThrNode,*BiThrTree;
  87. //以节点p为根的子树中序线索化
  88. //1代表是线索,0代表是子树
  89. void InThreading(BiThrTree p)
  90. {
  91. if(p)
  92. {
  93. InThreading(p->lchild);
  94. if(!p->lchild)
  95. {
  96. p->ltag=1;
  97. p->lchild=pre;
  98. }
  99. else
  100. {
  101. p->ltag=0;
  102. }
  103. if(!pre->rchild)
  104. {
  105. p->rtag=1;
  106. pre->rchild=p;
  107. }
  108. else
  109. {
  110. pre->rtag=0;
  111. }
  112. InThreading(p->rchild);
  113. }
  114. }
  115. //带头节点的二叉树中序线索化
  116. void InOrderThread(BiThrTree &Thrt,BiTree T)
  117. {
  118. Thrt=new BiThrNode;
  119. Thrt->ltag=0;
  120. // Thrt->lchild=T;
  121. Thrt->rtag=1;
  122. Thrt->rchild=Thrt;
  123. if(!T)
  124. {
  125. Thrt->lchild=Thrt;
  126. }
  127. else
  128. {
  129. Thrt->lchild=T;pre=Thr;
  130. InThreading(T);
  131. pre->rchild=Thrt;
  132. pre->rtag=1;
  133. Thrt->rchild=pre;//忘了
  134. }
  135. }
  136. //遍历中序线索二叉树
  137. //输出左边->输出自己->输出右边
  138. void InOrderTravese_Thr(BiThrTree &T)
  139. {
  140. p=T->lchild;
  141. while(p!=T)
  142. {
  143. while(!p->ltag) p=p->lchild;
  144. cout<<p->data;//输出左边
  145. while(p->rchild&&p->rchild!=T)
  146. {
  147. p=p->rchild;
  148. cout<<p->data;//输出自己
  149. }
  150. p=p->rchild;//往右边走
  151. }
  152. }
  153. //————————哈夫曼树的存储结构
  154. typedef struct
  155. {
  156. int weight;
  157. int parent,lchild,rchild;
  158. }HNode,*HuffmanTree;
  159.  
  160. //构造哈夫曼树
  161. void CreateHuffmanTree(HuffmanTree &HT,int n)
  162. {
  163. if(n<=1)return;
  164. m=2*n-1;
  165. HT=new HTNode[m+1];
  166. for(i=1;i<=m;++i)
  167. {
  168. HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;
  169. }
  170. for(int i=1;i<=n;++i)
  171. {
  172. cin>>HT[i].weight;
  173. }
  174. for(i=n+1;i<=m;++i)
  175. {
  176. Select(HT,i-1,s1,s2);
  177. HT[i].lchild=s1;
  178. HT[i].rchild=s2;
  179. HT[s1].parent=i;
  180. HT[s2].p79d7;iiarent=i;
  181. HT[i].weight=HT[s1].weight+HT[s2].weight;
  182. }
  183. }
  184. //------------------哈夫曼编码表的存储表示
  185. typedef char **HuffmanCode;
  186. //根据哈夫曼树求哈夫曼编码
  187. void CreateHuffmanNode(HuffmanTree HT,HuffmanCode &HC,int n)
  188. {
  189. HC=new char*[n+1];
  190. cd =new char[n];
  191. cd[n-1]='\0';
  192. for(i=1;i<=n;++i)
  193. {
  194. start=n-1;
  195. c=i;f=HT[i].parent;
  196. while(!f)
  197. {
  198. start--;
  199. if(HT[f].lchild==c)cd[start]='0';
  200. else cd[start]='1';
  201. c=f;
  202. f=HT[f].parent;
  203. }
  204. HC[i]=new char[n-start];
  205. strcpy(H[i],&cd[start]);
  206. }
  207. delete cd;
  208.  
  209. }

  第六章:

  1. //#define MAXINT
  2. //typedef struct
  3. //{
  4. // ELemtype vertice[MAXQSIZE];
  5. // int arc[MAXSIZE][MAXSIZE];
  6. // int vernum,arcnum;
  7. //}AMGraph;
  8.  
  9. #define MaxInt 32767 //表示极大值,即∞
  10. #define MVNum 100 //最大顶点数
  11. typedef char VerTexType; //假设顶点的数据类型为字符型
  12. typedef int ArcType; //假设边的权值类型为整型
  13. typedef struct
  14. {
  15. VerTexType vexs[MVNum]; //顶点表
  16. ArcType arcs[MVNum][MVNum]; //邻接矩阵
  17. int vexnum,arcnum; //图的当前点数和边数
  18. }AMGraph;
  19.  
  20. //采用邻接矩阵表示法,创建无向网G
  21. Status CreateUDN(AMGraph &G)
  22. {
  23. cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
  24. for(i = 0; i<G.vexnum; ++i)
  25. cin>>G.vexs[i]; //依次输入点的信息
  26. for(i = 0; i<G.vexnum;++i) //初始化邻接矩阵,边的权值均置为极大值
  27. for(j = 0; j<G.vexnum;++j)
  28. G.arcs[i][j] = MaxInt;
  29. for(k = 0; k<G.arcnum;++k)
  30. { //构造邻接矩阵
  31. cin>>v1>>v2>>w; //输入一条边依附的顶点及权值
  32. i = LocateVex(G, v1);
  33. j = LocateVex(G, v2); //确定v1和v2在G中的位置
  34. G.arcs[i][j] = w; //边<v1, v2>的权值置为w
  35. G.arcs[j][i] = G.arcs[i][j]; //置<v1, v2>的对称边<v2, v1>的权值为w
  36. }
  37. return OK;
  38. }
  39. int LocateVex(MGraph G,VertexType u)
  40. { /* 初始条件:图G存在,u和G中顶点有相同特征 */
  41. /* 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */
  42. int i;
  43. for(i=0;i<G.vexnum;++i)
  44. if(u==G.vexs[i])
  45. return i;
  46. return -1;
  47. }
  48. ///邻接表的存储表示
  49. #define MVNum 100 //最大顶点数
  50. typedef struct ArcNode{//边结点
  51. int adjvex; //该边所指向的顶点的位置
  52. struct ArcNode * nextarc; //指向下一条边的指针
  53. OtherInfo info; //和边相关的信息
  54. }ArcNode;
  55.  
  56. typedef struct VNode{
  57. VerTexType data; //顶点信息
  58. ArcNode * firstarc; //指向第一条依附该顶点的边的指针
  59. }VNode, AdjList[MVNum]; //AdjList表示邻接表类型
  60.  
  61. typedef struct{
  62. AdjList vertices; //邻接表
  63. int vexnum, arcnum; //图的当前顶点数和边数
  64. }ALGraph;
  65.  
  66. ///采用邻接表表示法,创建无向图G
  67. Status CreateUDG(ALGraph &G){
  68.  
  69.   cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
  70. for(i = 0; i<G.vexnum; ++i){ //输入各点,构造表头结点表
  71. cin>> G.vertices[i].data; //输入顶点值
  72. G.vertices[i].firstarc=NULL; //初始化表头结点的指针域为NULL
  73. }//for
  74. for(k = 0; k<G.arcnum;++k){ //输入各边,构造邻接表
  75. cin>>v1>>v2; //输入一条边依附的两个顶点
  76. i = LocateVex(G, v1);
  77. j = LocateVex(G, v2);
  78. p1=new ArcNode; //生成一个新的边结点*p1
  79.    p1->adjvex=j; //邻接点序号为j
  80.     p1->nextarc= G.vertices[i].firstarc; G.vertices[i].firstarc=p1;
  81. //将新结点*p1插入顶点vi的边表头部
  82. p2=new ArcNode; //生成另一个对称的新的边结点*p2
  83.    p2->adjvex=i; //邻接点序号为i
  84.     p2->nextarc= G.vertices[j].firstarc; G.vertices[j].firstarc=p2;
  85. //将新结点*p2插入顶点vj的边表头部
  86. }
  87. return OK;
  88. }//CreateUDG
  89.  
  90. void DFS(Graph G, int v)
  91. {
  92. cout<<v;
  93. visited[v] = true; //访问第v个顶点
  94. //依次检查邻接矩阵v所在的行
  95. for(w = FirstAdjVex(G,v);w>0; w=NextAdjVex(G,v,w))
  96. if(!visited[w])
  97. DFS(G, w);
  98. //w是v的邻接点,如果w未访问,则递归调用DFS
  99. }
  100. void DFS(AMGraph G, int v)
  101. {
  102. cout<<v;
  103. visited[v] = true; //访问第v个顶点
  104. for(w = 0;w<G.Vexnum;w++) //依次检查邻接矩阵v所在的行
  105. if((G.arcs[v][w]!=0)&&(!visited[w]))
  106. DFS(G, w);
  107. //w是v的邻接点,如果w未访问,则递归调用DFS
  108. }
  109. void DFS(ALGraph G, int v)
  110. { //图G为邻接表类型
  111. cout<<v;
  112. visited[v] = true; //访问第v个顶点
  113. p= G.vertices[v].firstarc; //p指向v的边链表的第一个边结点
  114. while(p!=NULL)
  115. { //边结点非空
  116. w=p->adjvex; //表示w是v的邻接点
  117. if(!visited[w])
  118. DFS(G, w); //如果w未访问,则递归调用DFS
  119. p=p->nextarc; //p指向下一个边结点
  120. }
  121. }
  122. void BFS (Graph G, int v)
  123. {
  124. //按广度优先非递归遍历连通图G
  125. cout<<v;
  126. visited[v] = true; //访问第v个顶点
  127. InitQueue(Q);//辅助队列Q初始化,置空
  128. EnQueue(Q, v);//v进队
  129. while(!QueueEmpty(Q))
  130. { //队列非空
  131. DeQueue(Q, u); //队头元素出队并置为u
  132. for(w = FirstAdjVex(G, u); w>=0; w = NextAdjVex(G, u, w))
  133. if(!visited[w])
  134. { //w为u的尚未访问的邻接顶点
  135. cout<<w;
  136. visited[w] = true;
  137. EnQueue(Q, w); //w进队
  138. }//if
  139. }//while
  140. }//BFS
  141.  
  142. void DFSTraverse(Graph G)
  143. {
  144. // 对图 G 作深度优先遍历。
  145. for (v=0; v<G.vexnum; ++v)
  146. visited[v] = FALSE; // 访问标志数组初始化
  147. for (v=0; v<G.vexnum; ++v)
  148. if(!visited[v])
  149. DFS(G, v);
  150. // 对尚未访问的顶点调用DFS
  151. }
  152.  
  153. ///无向网G用邻接矩阵存储
  154. ///普里姆算法从顶点u出发构造的最小生成树
  155. void MiniSpanTree_Prim(AMGraph G, VertexType u)
  156. {
  157. k = LocateVex ( G, u ); //U的下标k
  158. for( j=0; j<G.vexnum; ++j ) // 辅助数组初始化
  159. if (j!=k) closedge[j] = { u, G.arcs[k][j] };
  160. closedge[k].lowcost = 0; // 初始,U={u}
  161.  
  162. for (i=1; i<G.vexnum; ++i)
  163. {
  164. k = Min(closedge);
  165. // 求出加入生成树的下一个顶点(k)
  166. printf(closedge[k].adjvex, G.vexs[k]);
  167. // 输出生成树上一条边
  168. closedge[k].lowcost = 0; // 第k顶点并入U集
  169. for (j=0; j<G.vexnum; ++j)
  170. //修改其它顶点的最小边
  171. if (G.arcs[k][j] < closedge[j].lowcost)
  172. closedge[j] = { G.vexs[k], G.arcs[k][j]};
  173. }
  174. ///克鲁斯卡尔(Kruscal)算法
  175. struct
  176. {
  177. VerTexType Head; //边的始点
  178. VerTexType Tail; // 边的终点
  179. ArcType lowcost; // 边上的权值
  180. }Edge[arcnum];
  181. void MiniSpanTree_Kruskal(AMGraph G)
  182. {
  183. sort(Edge);
  184. for(i=0;i<G.Vexnum;i++)
  185. Vexset[i]=i;
  186. for(i=1;i<G.Vexnum;i++)
  187. {
  188. v1=LocateVex(G,Edge[i].Head);
  189. v2=LocateVex(G,Edge[i].Tail);
  190. vs1=Vexset[v1];
  191. vs2=Vexset[v2];
  192. if(vs1!=vs2)
  193. {
  194. cout<<Edge[i].Head<<Edge[i].Tail;
  195. for(i=0;i<G.Vexnum;i++)
  196. if(Vexset[i]==vs2)
  197. Vexset[i]=vs1;
  198. }
  199. }
  200. }
  201. ///用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径
  202. void ShortestPath_DIJ(AMGraph G, int v0)
  203. {
  204. n=G.vexnum; //n为G中顶点的个数
  205. for(v = 0; v<n; ++v)
  206. { //n个顶点依次初始化
  207. S[v] = false; //S初始为空集
  208. D[v] = G.arcs[v0][v]; //将v0到各个终点的最短路径长度初始化
  209. if(D[v]< MaxInt)
  210. Path [v]=v0; //v0和v之间有弧,将v的前驱置为v0
  211. else
  212. Path [v]=-1; //如果v0和v之间无弧,则将v的前驱置为-1
  213. }//for
  214.  
  215. S[v0]=true; //将v0加入S
  216. D[v0]=0; //源点到源点的距离为0
  217. /*―
  218. 开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集
  219. ―*/
  220. for(i=1;i<n; ++i)
  221. { //对其余n−1个顶点,依次进行计算
  222. min= MaxInt;
  223. for(w=0;w<n; ++w)
  224. if(!S[w]&&D[w]<min)
  225. {
  226. v=w;
  227. min=D[w];
  228. }
  229. //选择一条当前的最短路径,终点为v
  230. S[v]=true; //将v加入S
  231. //更新从v0出发到集合V−S上所有顶点的最短路径长度
  232. for(w=0;w<n; ++w)
  233. if(!S[w]&&(D[v]+G.arcs[v][w]<D[w])
  234. {
  235. D[w]=D[v]+G.arcs[v][w];//更新D[w]
  236. Path[w]=v; //更改w的前驱为v
  237. }//if
  238. }//for
  239. }//ShortestPath_DIJ
  240. ///用Floyd算法求有向网G中各对顶点v和w之
  241. ///间的最短路径
  242. Void ShortestPath_Floyed(AMGraph G)
  243. {
  244. for(i=0;i<G.vexnum;++i)//各对结点之间初始已知路径及距离
  245. for(j=0;j<G.vexnum;++j)
  246. {
  247. D[i][j]=G.arcs[i][j];
  248. if(D[i][j]<MaxInt) path[i][j]=i; //从v到w有直接路径
  249. else path[i][j]=-1;
  250. }//for
  251.  
  252. for(k=0;k<G.vexnum;++k)
  253. for(i=0;i<G.vexnum;++i)
  254. for(j=0;j<G.vexnum;++j)
  255. if(D[i][k]+D[k][j]<D[i][j])
  256. {
  257. //从v经u到w的一条路径更短
  258. D[i][j]=D[i][k]+D[k][j];
  259. path[i][j]=path[k][j];
  260. }//if
  261. }//ShortestPath_FLOYD
  262. ///拓扑排序AOV-网
  263. //有向图G采用邻接表存储结构
  264. //若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则ERROR。
  265. Status TopologicalSort( ALGraph G , int top[])
  266. {
  267. FindInDegree(G,indegree);//对各顶点求入度indegree[0..vernum-1]
  268. InitStack(S);
  269. for( i=0; i<G.vexnum; ++i) //建零入度顶点栈S
  270. if(!indegree[i]) Push(S, i);//入度为零的顶点入栈
  271. count=0; //对输出顶点计数
  272. while(!StackEmpty(S))
  273. {
  274. Pop(S, i);
  275. top[count]=i;
  276. ++count;
  277. for(p=G.vertices[i].Firstarc; p; p=p->nextarc)
  278. {
  279. k=p->adjvex; // 对i号顶点的每个邻接点的入度减一
  280. --indegree[k];
  281. if(!indegree[k]) Push(S,k); //若入度为零,则入栈
  282. }//for
  283. }//while
  284. if(count<G.vexnum )
  285. return ERROR;//该有向图有回路
  286. else
  287. return OK;
  288. }//TopologicalSort
  289.  
  290. ///拓扑排序
  291. Status TopologicalOrder(ALGraph G,int topo[])
  292. {
  293. FindInDegree(G,indegree);//对各顶点求入度indegree[0..vernum-1],建零入度顶点栈S;
  294. InitStack(S);
  295. for(i=0;i<G.vexnum;++i)
  296. if(!indegree[i]) Push(S,i);
  297. m=0;
  298. while(!StackEmpty(S))
  299. {
  300. Pop(S, i);
  301. topo[m]=i;
  302. ++m;
  303. p=G.vertices[i].firstarc;
  304. while(p)
  305. {
  306. k=p->adjvex; // 对j号顶点的每个邻接点的入度减1
  307. --indegree[k];
  308. if(indegree[k]==0)
  309. Push(S,k); //若入度减为零则入栈
  310. p=p->nextarc;
  311. }//for
  312.  
  313. }//while
  314. if (m<G.vexnum )
  315. return ERROR;//该有向网有回路
  316. else
  317. return OK;
  318. }//TopologicalOrder
  319. ///关键路径算法
  320. Status CriticalPath(ALGraph G)
  321. {
  322. if(!TopologicalOrder(G,topo)) return ERROR;//有回路
  323. n=G.vexnum;
  324. for(i =0 ;i<n;++i) ve[i]=0;
  325. // /*求最早发生时间*/
  326. for(i=0;i<n;++i)
  327. {
  328. k=topo[i];
  329. p=G.vertices[k].firstarc;
  330. while(!p)
  331. {
  332. j=p->adjvex;
  333. if(ve[j]<ve[k]+p->weight)
  334. ve[j]=ve[k]+p->weight;
  335. p=p->nextarc;
  336. }
  337. }
  338. for(i=0;o<n;++i)
  339. {
  340. vl[i]=ve[n-1];
  341. }p;;
  342. // /*最晚发生时间*/
  343. for(i=n-1;i>=0;--i)
  344. {
  345. k=topo[i];
  346. p=G.vertices[k].firstarc;
  347. while(!p)
  348. {
  349. j=p->adjvex;
  350. if(vl[k]>vl[j]-p->weight)
  351. vl[k]=vl[j]-p->weight;
  352. p=p->nextarc;
  353. }
  354. }
  355. // /*判断每一活动是否为关键活动*/
  356. for(i=0;i<n;++i)
  357. {
  358. p=G.vertices[i].firstarc;
  359. while(!p)
  360. {
  361. j=p->adjvex;
  362. e=ve[i];
  363. l=vl[j]-p->weight;
  364. if(e==l)
  365. cout<<G.vertices[i].data<<G.vertices[j].data;
  366. p=p->nextarc;
  367. }
  368. }
  369. }//CriticalPath

  

  

《数据结构(C语言)》苏小红 课本案例的更多相关文章

  1. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  2. 数据结构(C语言)—排序

    数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...

  3. YAML 语言教程与使用案例

    YAML语言教程与使用案例,如何编与读懂写YAML文件. YAML概要 YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写.在开发的这种 ...

  4. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  5. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  6. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  7. Python语言数据结构和语言结构(2)

    目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名   变量命名规则主要有以下几 ...

  8. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  9. 图的存储结构大赏------数据结构C语言(图)

    图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...

随机推荐

  1. idea工具

    1. 使用IntelliJ IDEA 配置JDK(入门)   https://blog.csdn.net/nobb111/article/details/77116259 2. idea 调试快捷键  ...

  2. 洛谷 P1073 最优贸易 题解

    题面 大家都是两遍SPFA吗?我这里就一遍dp啊: 首先判断对于一个点u,是否可以从一号点走到这里,并且可以从u走到n号点: 对于这样的点我们打上标记: 那么抛出水晶球的点一定是从打上标记的点中选出一 ...

  3. import和from.…import…

    import和from.-import- 在讲之前我们先来讲一下怎样去下载第三方库,我们把python看作一部手机,pip就是应用管家,第三方库里面的模块就是应用管家里面的一个应用 一.import模 ...

  4. docker无法删除<none>镜像

    .进入root权限 sudo su # 或 sudo -i .停止所有的container(这样才能够删除其中的images): docker stop $(docker ps -a -q) 如果想要 ...

  5. 22、nlpir 人工智能

    练习介绍 [程序功能] 我们将完成一个和语义识别相关的爬虫程序,输入任意词汇.句子.文章或段落,会返回联想的词汇. [背景信息] 有一个非常牛的处理语言的网站nlpir,上面有非常多的处理语言的功能( ...

  6. ThinkPHP中header()无法发生跳转的解决办法

    一定要在header('Location:url')后加上exit()/die()才可以,特此记录.

  7. 81. Search in Rotated Sorted Array II (JAVA)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  8. 银联支付SDK集成

    下载地址 https://open.unionpay.com/upload/download/Development_kit85427986.rar其实我找了半个小时 也不知道怎么就下载好了 这个我在 ...

  9. SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用

    这篇文章主要介绍了SQLite3中自增主键相关知识总结,清零的方法.INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以参考下 一.SQLite清空表 ...

  10. Visual Studio Code python 代码快速自动提示

    1.file --> setting->设置 搜索 python 或者auto_complete setting.json { "explorer.confirmDelete&q ...