当前位置:   article > 正文

scau 数据结构上机试题

scau 数据结构上机试题

实验1

8576 顺序线性表的基本操作

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define OK 1
  4. #define ERROR 0
  5. #define LIST_INIT_SIZE 100
  6. #define LISTINCREMENT 10
  7. #define ElemType int
  8. typedef struct
  9. {
  10. int *elem;
  11. int length;
  12. int listsize;
  13. }SqList;
  14. int InitList_Sq(SqList &L)
  15. {
  16. // 算法2.3,构造一个空的线性表L,该线性表预定义大小为LIST_INIT_SIZE
  17. // 请补全代码
  18. L.elem=new ElemType[LIST_INIT_SIZE];
  19. if(!L.elem) return 1;
  20. L.length=0;
  21. L.listsize=LIST_INIT_SIZE;
  22. return 0;
  23. }
  24. int Load_Sq(SqList &L)
  25. {
  26. // 输出顺序表中的所有元素
  27. int i;
  28. if(L.length==0) printf("The List is empty!"); // 请填空
  29. else
  30. {
  31. printf("The List is: ");
  32. for(i=0;i<L.length;i++) printf("%d ",L.elem[i]); // 请填空
  33. }
  34. printf("\n");
  35. return OK;
  36. }
  37. int ListInsert_Sq(SqList &L,int i,int e)
  38. {
  39. // 算法2.4,在顺序线性表L中第i个位置之前插入新的元素e
  40. // i的合法值为1≤i≤L.length +1
  41. // 请补全代码
  42. if(i<1||i>L.length+1)
  43. return 1;
  44. else
  45. {
  46. for(int j=L.length-1;j>=i-1;j--)
  47. {
  48. L.elem[j+1]=L.elem[j];
  49. }
  50. L.elem[i-1]=e;
  51. ++L.length;
  52. return 0;
  53. }
  54. }
  55. int ListDelete_Sq(SqList &L,int i, int &e)
  56. {
  57. // 算法2.5,在顺序线性表L中删除第i个位置的元素,并用e返回其值
  58. // i的合法值为1≤i≤L.length
  59. // 请补全代码
  60. if(i<1||i>L.length)
  61. return 1;
  62. else
  63. {
  64. e=L.elem[i-1];
  65. for(int j=i-1;j<=L.length-1;j++)
  66. {
  67. L.elem[j]=L.elem[j+1];
  68. }
  69. L.length--;
  70. return 0;
  71. }
  72. }
  73. int main()
  74. {
  75. SqList T;
  76. int a, i;
  77. ElemType e, x;
  78. if(!InitList_Sq(T)) // 判断顺序表是否创建成功
  79. {
  80. printf("A Sequence List Has Created.\n");
  81. }
  82. while(1)
  83. {
  84. printf("1:Insert element\n2:Delete element\n3:Load all elements\n0:Exit\nPlease choose:\n");
  85. scanf("%d",&a);
  86. switch(a)
  87. {
  88. case 1: scanf("%d%d",&i,&x);
  89. if(ListInsert_Sq(T,i,x)) printf("Insert Error!\n"); // 执行插入函数,根据返回值判断i值是否合法
  90. else printf("The Element %d is Successfully Inserted!\n", x);
  91. break;
  92. case 2: scanf("%d",&i);
  93. if(ListDelete_Sq(T,i,e)) printf("Delete Error!\n"); // 执行删除函数,根据返回值判断i值是否合法
  94. else printf("The Element %d is Successfully Deleted!\n", e);
  95. break;
  96. case 3: Load_Sq(T);
  97. break;
  98. case 0: return 1;
  99. }
  100. }
  101. }

8577 合并顺序表

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <iostream>
  4. using namespace std;
  5. #define OK 1
  6. #define ERROR 0
  7. #define ElemType int
  8. #define LIST_INIT_SIZE 100
  9. typedef int Status;
  10. typedef struct
  11. {
  12. int *elem;
  13. int length;
  14. int listsize;
  15. }SqList;
  16. Status InitList_Sq(SqList &L)
  17. {
  18. L.elem=new ElemType[LIST_INIT_SIZE];
  19. if(!L.elem) return ERROR;
  20. L.length=0;
  21. L.listsize=LIST_INIT_SIZE;
  22. return OK;
  23. }
  24. Status CreatList_Sq(SqList &L,int n)
  25. {
  26. if(!InitList_Sq(L)) return ERROR;
  27. for(int i=0;i<n;i++)
  28. {
  29. cin>>L.elem[i];
  30. L.length++;
  31. }
  32. return OK;
  33. }
  34. Status PrintList_Sq(SqList L)
  35. {
  36. if(L.length==0)
  37. cout<<'The List is empty!';
  38. int i;
  39. for(i=0;i<L.length;i++)
  40. {
  41. cout<<L.elem[i]<<' ';
  42. }
  43. cout<<endl;
  44. return OK;
  45. }
  46. Status MergeList_Sq(SqList LA,SqList LB,SqList &LC)
  47. {
  48. int *pa,*pb,*pc,*pa_last,*pb_last;
  49. LC.length=LA.length+LB.length;
  50. LC.elem=new ElemType[LC.length];
  51. pc=LC.elem;
  52. pa=LA.elem;
  53. pb=LB.elem;
  54. pa_last=LA.elem+LA.length-1;
  55. pb_last=LB.elem+LB.length-1;
  56. while(pa<=pa_last&&pb<=pb_last)
  57. {
  58. if((*pa)<=(*pb))
  59. *pc++=*pa++;
  60. else
  61. *pc++=*pb++;
  62. }
  63. while(pa<=pa_last) *pc++=*pa++;
  64. while(pb<=pb_last) *pc++=*pb++;
  65. }
  66. int main()
  67. {
  68. SqList A,B,C;
  69. int n,m;
  70. InitList_Sq(A);
  71. InitList_Sq(B);
  72. InitList_Sq(C);
  73. cin>>n;
  74. CreatList_Sq(A,n);
  75. cin>>m;
  76. CreatList_Sq(B,m);
  77. cout<<"List A:";
  78. PrintList_Sq(A);
  79. cout<<"List B:";
  80. PrintList_Sq(B);
  81. MergeList_Sq(A,B,C);
  82. cout<<"List C:";
  83. PrintList_Sq(C);
  84. return 0;
  85. }

 8578 顺序表逆置

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<iostream>
  4. #define OK 1
  5. #define ERROR 0
  6. #define LIST_INIT_SIZE 100
  7. #define LISTINCREMENT 10
  8. #define ElemType int
  9. using namespace std;
  10. typedef int Status;
  11. typedef struct
  12. {
  13. int *elem;
  14. int length;
  15. int listsize;
  16. }SqList;
  17. Status InitList_Sq(SqList &L)
  18. { // 算法2.3
  19. // 构造一个空的线性表L。
  20. L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  21. if (!L.elem) return OK; // 存储分配失败
  22. L.length = 0; // 空表长度为0
  23. L.listsize = LIST_INIT_SIZE; // 初始存储容量
  24. return OK;
  25. } // InitList_Sq
  26. Status ListInsert_Sq(SqList &L, int i, ElemType e)
  27. { // 算法2.4
  28. // 在顺序线性表L的第i个元素之前插入新的元素e,
  29. // i的合法值为1≤i≤ListLength_Sq(L)+1
  30. ElemType *p;
  31. if (i < 1 || i > L.length+1) return ERROR; // i值不合法
  32. if (L.length >= L.listsize) { // 当前存储空间已满,增加容量
  33. ElemType *newbase = (ElemType *)realloc(L.elem,
  34. (L.listsize+LISTINCREMENT)*sizeof (ElemType));
  35. if (!newbase) return ERROR; // 存储分配失败
  36. L.elem = newbase; // 新基址
  37. L.listsize += LISTINCREMENT; // 增加存储容量
  38. }
  39. ElemType *q = &(L.elem[i-1]); // q为插入位置
  40. for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
  41. // 插入位置及之后的元素右移
  42. *q = e; // 插入e
  43. ++L.length; // 表长增1
  44. return OK;
  45. } // ListInsert_Sq
  46. Status ListDelete_Sq(SqList &L, int i, ElemType &e)
  47. { // 算法2.5
  48. // 在顺序线性表L中删除第i个元素,并用e返回其值。
  49. // i的合法值为1≤i≤ListLength_Sq(L)。
  50. ElemType *p, *q;
  51. if (i<1 || i>L.length) return ERROR; // i值不合法
  52. p = &(L.elem[i-1]); // p为被删除元素的位置
  53. e = *p; // 被删除元素的值赋给e
  54. q = L.elem+L.length-1; // 表尾元素的位置
  55. for (++p; p<=q; ++p) *(p-1) = *p; // 被删除元素之后的元素左移
  56. --L.length; // 表长减1
  57. return OK;
  58. } // ListDelete_Sq
  59. Status CreatList_Sq(SqList &L,int n)
  60. {
  61. if(!InitList_Sq(L)) return ERROR;
  62. for(int i=0;i<n;i++)
  63. {
  64. cin>>L.elem[i];
  65. L.length++;
  66. }
  67. return OK;
  68. }
  69. Status PrintList_Sq(SqList L)
  70. {
  71. for(int i=0;i<L.length;i++)
  72. {
  73. cout<<L.elem[i]<<' ';
  74. }
  75. cout<<endl;
  76. return OK;
  77. }
  78. Status DaozhiList_Sq(SqList &L)
  79. {
  80. ElemType p;
  81. for(int n=0;n<L.length/2;n++)
  82. {
  83. p=L.elem[n];
  84. L.elem[n]=L.elem[L.length-1-n];
  85. L.elem[L.length-1-n]=p;
  86. }
  87. return OK;
  88. }
  89. int main()
  90. {
  91. ElemType n;
  92. SqList T;
  93. InitList_Sq(T);
  94. cin>>n;
  95. CreatList_Sq(T,n);
  96. cout<<"The List is:";
  97. PrintList_Sq(T);
  98. DaozhiList_Sq(T);
  99. cout<<"The turned List is:";
  100. PrintList_Sq(T);
  101. return 0;
  102. }

8579 链式线性表的基本操作

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<iostream>
  4. #define ERROR 0
  5. #define OK 1
  6. #define ElemType int
  7. using namespace std;
  8. typedef struct LNode
  9. {
  10. int data;
  11. struct LNode *next;
  12. }LNode,*LinkList;
  13. int CreateLink_L(LinkList &L,int n){
  14. // 创建含有n个元素的单链表
  15. LinkList p,q;
  16. int i;
  17. ElemType e;
  18. L = new LNode;
  19. L->next = NULL; // 先建立一个带头结点的单链表
  20. q = L;
  21. for (i=0; i<n; i++) {
  22. scanf("%d", &e);
  23. p = new LNode; // 生成新结点
  24. p->data=e;
  25. p->next=NULL;
  26. q->next=p;
  27. q=p;// 请补全代码
  28. }
  29. return OK;
  30. }
  31. int LoadLink_L(LinkList &L){
  32. // 单链表遍历
  33. LinkList p = L->next;
  34. if(!p)printf("The List is empty!"); // 请填空
  35. else
  36. {
  37. printf("The LinkList is:");
  38. while(p!=NULL) // 请填空
  39. {
  40. printf("%d ",p->data);
  41. p=p->next; // 请填空
  42. }
  43. }
  44. printf("\n");
  45. return OK;
  46. }
  47. int LinkInsert_L(LinkList &L,int i,ElemType e){
  48. // 算法2.9
  49. // 在带头结点的单链线性表L中第i个位置之前插入元素e
  50. // 请补全代码
  51. LinkList p=L,s;
  52. int j=0;
  53. while(p&&j<i-1)
  54. {
  55. p=p->next;
  56. j++;
  57. }
  58. if(!p||j>i-1) return ERROR;
  59. s=new LNode;
  60. s->data=e;
  61. s->next=p->next;
  62. p->next=s;
  63. return OK;
  64. }
  65. int LinkDelete_L(LinkList &L,int i, ElemType &e){
  66. // 算法2.10
  67. // 在带头结点的单链线性表L中,删除第i个元素,并用e返回其值
  68. // 请补全代码
  69. LinkList p=L,t;
  70. int j=0;
  71. while(p->next&&j<i-1)
  72. {
  73. p=p->next;
  74. j++;
  75. }
  76. if(!p->next||j>i-1) return ERROR;
  77. t=p->next;
  78. e=t->data;
  79. p->next=t->next;
  80. delete t;
  81. return OK;
  82. }
  83. int main()
  84. {
  85. LinkList T;
  86. int a,n,i;
  87. ElemType x, e;
  88. printf("Please input the init size of the linklist:\n");
  89. scanf("%d",&n);
  90. printf("Please input the %d element of the linklist:\n", n);
  91. if(CreateLink_L(T,n)) // 判断链表是否创建成功,请填空
  92. {
  93. printf("A Link List Has Created.\n");
  94. LoadLink_L(T);
  95. }
  96. while(1)
  97. {
  98. printf("1:Insert element\n2:Delete element\n3:Load all elements\n0:Exit\nPlease choose:\n");
  99. scanf("%d",&a);
  100. switch(a)
  101. {
  102. case 1: scanf("%d%d",&i,&x);
  103. if(!LinkInsert_L(T,i,x)) printf("Insert Error!\n"); // 判断i值是否合法,请填空
  104. else printf("The Element %d is Successfully Inserted!\n", x);
  105. break;
  106. case 2: scanf("%d",&i);
  107. if(!LinkDelete_L(T,i,e)) printf("Delete Error!\n"); // 判断i值是否合法,请填空
  108. else printf("The Element %d is Successfully Deleted!\n", e);
  109. break;
  110. case 3: LoadLink_L(T);
  111. break;
  112. case 0: return 1;
  113. }
  114. }
  115. }

8580 合并链表

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #define ERROR 0
  4. #define OK 1
  5. #define ElemType int
  6. #include<iostream>
  7. using namespace std;
  8. typedef int Status;
  9. typedef struct LNode
  10. {
  11. int data;
  12. struct LNode *next;
  13. }LNode,*LinkList;
  14. Status CreatLinkList_L(LinkList &L,int n)
  15. {
  16. LinkList p,q;
  17. ElemType e;
  18. L=new LNode;
  19. L->next=NULL;
  20. q=L;
  21. while(n--)
  22. {
  23. cin>>e;
  24. p=new LNode;
  25. p->data=e;
  26. p->next=NULL;
  27. q->next=p;
  28. q=p;
  29. }
  30. return OK;
  31. }
  32. Status ListInsert_L(LinkList &L, int i, ElemType e) { // 算法2.9
  33. // 在带头结点的单链线性表L的第i个元素之前插入元素e
  34. LinkList p,s;
  35. p = L;
  36. int j = 0;
  37. while (p && j < i-1) { // 寻找第i-1个结点
  38. p = p->next;
  39. ++j;
  40. }
  41. if (!p || j > i-1) return ERROR; // i小于1或者大于表长
  42. s = (LinkList)malloc(sizeof(LNode)); // 生成新结点
  43. s->data = e; s->next = p->next; // 插入L中
  44. p->next = s;
  45. return OK;
  46. } // LinstInsert_L
  47. Status ListDelete_L(LinkList &L, int i, ElemType &e) { // 算法2.10
  48. // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
  49. LinkList p,q;
  50. p = L;
  51. int j = 0;
  52. while (p->next && j < i-1) { // 寻找第i个结点,并令p指向其前趋
  53. p = p->next;
  54. ++j;
  55. }
  56. if (!(p->next) || j > i-1) return ERROR; // 删除位置不合理
  57. q = p->next;
  58. p->next = q->next; // 删除并释放结点
  59. e = q->data;
  60. free(q);
  61. return OK;
  62. } // ListDelete_L
  63. Status MergeList_L(LinkList LA,LinkList LB,LinkList &LC)
  64. {
  65. LinkList la,lb,lc;
  66. LC=new LNode;
  67. la=LA->next;
  68. lb=LB->next;
  69. lc=LC=LA;
  70. while(la&&lb)
  71. {
  72. if(la->data<lb->data)
  73. {
  74. lc->next=la;
  75. lc=la;
  76. la=la->next;
  77. }
  78. else
  79. {
  80. lc->next=lb;
  81. lc=lb;
  82. lb=lb->next;
  83. }
  84. }
  85. if(la&&!lb) {lc->next=la;}
  86. if(!la&&lb) lc->next=lb;
  87. return OK;
  88. }
  89. Status PrintList_L(LinkList L)
  90. {
  91. LinkList p=L;
  92. if(p->next==NULL) return ERROR;
  93. while(p->next)
  94. {
  95. p=p->next;
  96. cout<<p->data<<' ';
  97. }
  98. cout<<endl;
  99. return OK;
  100. }
  101. int main()
  102. {
  103. int n;
  104. LinkList A,B,C;
  105. cin>>n;
  106. CreatLinkList_L(A,n);
  107. cin>>n;
  108. CreatLinkList_L(B,n);
  109. cout<<"List A:";
  110. PrintList_L(A);
  111. cout<<"List B:";
  112. PrintList_L(B);
  113. MergeList_L(A,B,C);
  114. cout<<"List C:";
  115. PrintList_L(C);
  116. return 0;
  117. }

19080 反转链表

  1. #include <iostream>//C++
  2. using namespace std;
  3. struct LNode
  4. {
  5. int data;
  6. LNode * next;
  7. };
  8. void createList(LNode * &L,int n)
  9. {
  10. //< 尾插法创建单链表
  11. LNode *r, *p;
  12. r=L=new LNode;//< 创建头结点
  13. L->next=NULL;
  14. for(int i=1; i<=n; i++)
  15. {
  16. p=new LNode;
  17. cin>>p->data;
  18. p->next=NULL;
  19. r->next=p;
  20. r=p;
  21. }
  22. }
  23. void trv(LNode * L)
  24. {
  25. //< 一个简单的链表遍历函数,供编程过程中测试使用
  26. L=L->next;
  27. while(L)
  28. {
  29. cout<<L->data<<' ';
  30. L=L->next;
  31. }
  32. }
  33. void reverseList(LNode * &L)
  34. {
  35. LNode *pre=NULL,*cur=L->next,*nex=NULL;
  36. while(cur)
  37. {
  38. nex=cur->next;
  39. cur->next=pre;
  40. pre=cur;
  41. cur=nex;
  42. }
  43. L->next=pre;
  44. }
  45. int main()
  46. {
  47. int n;
  48. LNode *L;
  49. cin>>n;
  50. createList(L,n);
  51. reverseList(L);
  52. trv(L);
  53. return 0;
  54. }

实验2

8583 顺序栈的基本操作

  1. #include<malloc.h>
  2. #include<stdio.h>
  3. #define OK 1
  4. #define ERROR 0
  5. #define STACK_INIT_SIZE 100 // 存储空间初始分配量
  6. #define STACKINCREMENT 10 // 存储空间分配增量
  7. typedef int SElemType; // 定义栈元素类型
  8. typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
  9. struct SqStack
  10. {
  11. SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
  12. SElemType *top; // 栈顶指针
  13. int stacksize; // 当前已分配的存储空间,以元素为单位
  14. }; // 顺序栈
  15. Status InitStack(SqStack &S)
  16. {
  17. // 构造一个空栈S,该栈预定义大小为STACK_INIT_SIZE
  18. // 请补全代码
  19. S.base=new SElemType[STACK_INIT_SIZE];
  20. if(!S.base) return ERROR;
  21. S.top=S.base;
  22. S.stacksize=STACK_INIT_SIZE;
  23. return OK;
  24. }
  25. Status Push(SqStack &S,SElemType e)
  26. {
  27. // 在栈S中插入元素e为新的栈顶元素
  28. // 请补全代码
  29. if(S.top-S.base==STACK_INIT_SIZE) return ERROR;
  30. *S.top++=e;
  31. return OK;
  32. }
  33. Status Pop(SqStack &S,SElemType &e)
  34. {
  35. // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  36. // 请补全代码
  37. if(!(S.top==S.base))
  38. {
  39. e=*--S.top;
  40. return OK;
  41. }
  42. else return ERROR;
  43. }
  44. Status GetTop(SqStack S,SElemType &e)
  45. {
  46. // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
  47. // 请补全代码
  48. if(S.top==S.base) return ERROR;
  49. e=*(S.top-1);
  50. return OK;
  51. }
  52. int StackLength(SqStack S)
  53. {
  54. // 返回栈S的元素个数
  55. // 请补全代码
  56. return (S.top-S.base);
  57. }
  58. Status StackTraverse(SqStack S)
  59. {
  60. // 从栈顶到栈底依次输出栈中的每个元素
  61. SElemType *p = S.top; //请填空
  62. if(S.top==S.base)printf("The Stack is Empty!"); //请填空
  63. else
  64. {
  65. printf("The Stack is: ");
  66. while(p!=S.base) //请填空
  67. {
  68. p--;//请填空
  69. printf("%d ", *p);
  70. }
  71. }
  72. printf("\n");
  73. return OK;
  74. }
  75. int main()
  76. {
  77. int a;
  78. SqStack S;
  79. SElemType x, e;
  80. if(InitStack(S)) // 判断顺序表是否创建成功,请填空
  81. {
  82. printf("A Stack Has Created.\n");
  83. }
  84. while(1)
  85. {
  86. printf("1:Push \n2:Pop \n3:Get the Top \n4:Return the Length of the Stack\n5:Load the Stack\n0:Exit\nPlease choose:\n");
  87. scanf("%d",&a);
  88. switch(a)
  89. {
  90. case 1: scanf("%d", &x);
  91. if(!Push(S,x)) printf("Push Error!\n"); // 判断Push是否合法,请填空
  92. else printf("The Element %d is Successfully Pushed!\n", x);
  93. break;
  94. case 2: if(!Pop(S,e)) printf("Pop Error!\n"); // 判断Pop是否合法,请填空
  95. else printf("The Element %d is Successfully Poped!\n", e);
  96. break;
  97. case 3: if(!GetTop(S,e))printf("Get Top Error!\n"); // 判断Get Top是否合法,请填空
  98. else printf("The Top Element is %d!\n", e);
  99. break;
  100. case 4: printf("The Length of the Stack is %d!\n",StackLength(S)); //请填空
  101. break;
  102. case 5: StackTraverse(S); //请填空
  103. break;
  104. case 0: return 1;
  105. }
  106. }
  107. }

8584 循环队列的基本操作

  1. #include<malloc.h>
  2. #include<stdio.h>
  3. #define OK 1
  4. #define ERROR 0
  5. typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
  6. typedef int QElemType;
  7. #define MAXQSIZE 100 // 最大队列长度(对于循环队列,最大队列长度要减1)
  8. typedef struct
  9. {
  10. QElemType *base; // 初始化的动态分配存储空间
  11. int front; // 头指针,若队列不空,指向队列头元素
  12. int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置
  13. }SqQueue;
  14. Status InitQueue(SqQueue &Q)
  15. {
  16. // 构造一个空队列Q,该队列预定义大小为MAXQSIZE
  17. // 请补全代码
  18. Q.base=new QElemType[MAXQSIZE];
  19. if(!Q.base) return ERROR;
  20. Q.front=Q.rear=0;
  21. return OK;
  22. }
  23. Status EnQueue(SqQueue &Q,QElemType e)
  24. {
  25. // 插入元素e为Q的新的队尾元素
  26. // 请补全代码
  27. if((Q.rear+1)%MAXQSIZE==Q.front)
  28. return ERROR;
  29. Q.base[Q.rear]=e;
  30. Q.rear=(Q.rear+1)%MAXQSIZE;
  31. return OK;
  32. }
  33. Status DeQueue(SqQueue &Q, QElemType &e)
  34. {
  35. // 若队列不空, 则删除Q的队头元素, 用e返回其值, 并返回OK; 否则返回ERROR
  36. // 请补全代码
  37. if(Q.front==Q.rear) return ERROR;
  38. e=Q.base[Q.front];
  39. Q.front=(Q.front+1)%MAXQSIZE;
  40. return OK;
  41. }
  42. Status GetHead(SqQueue Q, QElemType &e)
  43. {
  44. // 若队列不空,则用e返回队头元素,并返回OK,否则返回ERROR
  45. // 请补全代码
  46. if(Q.front==Q.rear) return ERROR;
  47. e=Q.base[Q.front];
  48. return OK;
  49. }
  50. int QueueLength(SqQueue Q)
  51. {
  52. // 返回Q的元素个数
  53. // 请补全代码
  54. return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
  55. }
  56. Status QueueTraverse(SqQueue Q)
  57. {
  58. // 若队列不空,则从队头到队尾依次输出各个队列元素,并返回OK;否则返回ERROR.
  59. int i;
  60. i=Q.front;
  61. if(Q.rear==Q.front)printf("The Queue is Empty!"); //请填空
  62. else{
  63. printf("The Queue is: ");
  64. while(i!=Q.rear) //请填空
  65. {
  66. printf("%d ",Q.base[i] ); //请填空
  67. i = (i+1)%MAXQSIZE; //请填空
  68. }
  69. }
  70. printf("\n");
  71. return OK;
  72. }
  73. int main()
  74. {
  75. int a;
  76. SqQueue S;
  77. QElemType x, e;
  78. if(InitQueue(S)) // 判断顺序表是否创建成功,请填空
  79. {
  80. printf("A Queue Has Created.\n");
  81. }
  82. while(1)
  83. {
  84. printf("1:Enter \n2:Delete \n3:Get the Front \n4:Return the Length of the Queue\n5:Load the Queue\n0:Exit\nPlease choose:\n");
  85. scanf("%d",&a);
  86. switch(a)
  87. {
  88. case 1: scanf("%d", &x);
  89. if(!EnQueue(S,x)) printf("Enter Error!\n"); // 判断入队是否合法,请填空
  90. else printf("The Element %d is Successfully Entered!\n", x);
  91. break;
  92. case 2: if(!DeQueue(S,e)) printf("Delete Error!\n"); // 判断出队是否合法,请填空
  93. else printf("The Element %d is Successfully Deleted!\n", e);
  94. break;
  95. case 3: if(!GetHead(S,e))printf("Get Head Error!\n"); // 判断Get Head是否合法,请填空
  96. else printf("The Head of the Queue is %d!\n", e);
  97. break;
  98. case 4: printf("The Length of the Queue is %d!\n",QueueLength(S)); //请填空
  99. break;
  100. case 5: QueueTraverse(S); //请填空
  101. break;
  102. case 0: return 1;
  103. }
  104. }
  105. }

8585 栈的应用——进制转换

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<malloc.h>
  5. #define OK 1
  6. #define ERROR 0
  7. #define StackInitSize 100
  8. typedef int Status;
  9. typedef int SElemType;
  10. using namespace std;
  11. struct SqStack
  12. {
  13. SElemType *base;
  14. SElemType *top;
  15. int stacksize;
  16. };
  17. Status CreateStack_S(SqStack &S)
  18. {
  19. S.base=new SElemType[StackInitSize];
  20. if(!S.base) return ERROR;
  21. S.top=S.base;
  22. S.stacksize=StackInitSize;
  23. return OK;
  24. }
  25. Status PoPStack_S(SqStack &S,SElemType x)
  26. {
  27. if(S.top-S.base==StackInitSize) return ERROR;
  28. *S.top++=x;
  29. return OK;
  30. }
  31. Status PushStack_S(SqStack &S,SElemType e)
  32. {
  33. if(S.top==S.base) return ERROR;
  34. e=*--S.top;
  35. return OK;
  36. }
  37. Status StackTraverse(SqStack S)
  38. {
  39. // 从栈顶到栈底依次输出栈中的每个元素
  40. SElemType *p = S.top; //请填空
  41. if(S.top==S.base)return ERROR;
  42. while(p!=S.base) //请填空
  43. {
  44. p--;//请填空
  45. printf("%d", *p);
  46. }
  47. return OK;
  48. }
  49. void Transnum8(SqStack &S,int n)
  50. {
  51. int a,b;
  52. while(n)
  53. {
  54. a=n%8;
  55. PoPStack_S(S,a);
  56. n=n/8;
  57. }
  58. StackTraverse(S);
  59. }
  60. int main()
  61. {
  62. SqStack S;
  63. SElemType x,e;
  64. CreateStack_S(S);
  65. int n;
  66. cin>>n;
  67. Transnum8(S,n);
  68. return 0;
  69. }

8586 括号匹配检验

  1. typedef char SElemType;
  2. #include"malloc.h"
  3. #include"stdio.h"
  4. #include"math.h"
  5. #include"stdlib.h" // exit()
  6. #define OK 1
  7. #define ERROR 0
  8. #define TRUE 1
  9. #define FALSE 0
  10. typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
  11. #define STACK_INIT_SIZE 10 // 存储空间初始分配量
  12. #define STACKINCREMENT 2 // 存储空间分配增量
  13. struct SqStack
  14. {
  15. SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
  16. SElemType *top; // 栈顶指针
  17. int stacksize; // 当前已分配的存储空间,以元素为单位
  18. }; // 顺序栈
  19. Status InitStack(SqStack &S)
  20. {
  21. S.base=new SElemType[STACK_INIT_SIZE];
  22. if(!S.base) return ERROR;
  23. S.top=S.base;
  24. S.stacksize=STACK_INIT_SIZE;
  25. return OK;
  26. }
  27. Status StackEmpty(SqStack S)
  28. {
  29. if(S.top==S.base)
  30. return OK;
  31. else
  32. return 0;
  33. }
  34. Status Push(SqStack &S,SElemType &e)
  35. {
  36. if(S.top==S.base) return ERROR;
  37. e=*--S.top;
  38. return OK;
  39. }
  40. Status Pop(SqStack &S,SElemType e)
  41. {
  42. if(S.top-S.base==S.stacksize) return ERROR;
  43. *S.top++=e;
  44. return OK;
  45. }
  46. void check()
  47. { // 对于输入的任意一个字符串,检验括号是否配对
  48. SqStack s;
  49. SElemType ch[80],*p,e;
  50. if(InitStack(s)) // 初始化栈成功
  51. {
  52. //printf("请输入表达式\n");
  53. gets(ch);
  54. p=ch;
  55. while(*p) // 没到串尾
  56. {
  57. switch(*p)
  58. {
  59. case '(':
  60. case '[':Pop(s,*p++);
  61. break; // 左括号入栈,且p++
  62. case ')':
  63. case ']':if(!StackEmpty(s)) // 栈不空
  64. {
  65. Push(s,e); // 弹出栈顶元素
  66. if(*p==')'&&e!='('||*p==']'&&e!='[')
  67. // 弹出的栈顶元素与*p不配对
  68. {
  69. printf("isn't matched pairs\n");
  70. exit(ERROR);
  71. }
  72. else
  73. {
  74. p++;
  75. break; // 跳出switch语句
  76. }
  77. }
  78. else // 栈空
  79. {
  80. printf("lack of left parenthesis\n");
  81. exit(ERROR);
  82. }
  83. default: p++; // 其它字符不处理,指针向后移
  84. }
  85. }
  86. if(StackEmpty(s)) // 字符串结束时栈空
  87. printf("matching\n");
  88. else
  89. printf("lack of right parenthesis\n");
  90. }
  91. }
  92. int main()
  93. {
  94. check();
  95. }

8587 行编辑程序

  1. typedef char SElemType;
  2. #include"malloc.h"
  3. #include"stdio.h"
  4. #include"math.h"
  5. #include"stdlib.h" // exit()
  6. #define OK 1
  7. #define ERROR 0
  8. #define TRUE 1
  9. #define FALSE 0
  10. typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
  11. #define STACK_INIT_SIZE 100 // 存储空间初始分配量
  12. #define STACKINCREMENT 2 // 存储空间分配增量
  13. struct SqStack
  14. {
  15. SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
  16. SElemType *top; // 栈顶指针
  17. int stacksize; // 当前已分配的存储空间,以元素为单位
  18. }; // 顺序栈
  19. Status InitStack(SqStack &S)
  20. { // 构造一个空栈S
  21. S.base=new SElemType[STACK_INIT_SIZE];
  22. if(!S.base) return ERROR;
  23. S.top=S.base;
  24. S.stacksize=STACK_INIT_SIZE;
  25. return OK;
  26. }
  27. Status StackEmpty(SqStack S)
  28. { // 若栈S为空栈,则返回TRUE,否则返回FALSE
  29. if(S.top==S.base) return TRUE;
  30. else return FALSE;
  31. }
  32. Status ClearStack(SqStack &S)
  33. { // 把S置为空栈
  34. S.top=S.base;
  35. return OK;
  36. }
  37. Status DestroyStack(SqStack &S)
  38. { // 销毁栈S,S不再存在
  39. free(S.base);
  40. S.base=NULL;
  41. S.top=NULL;
  42. S.stacksize=0;
  43. return OK;
  44. }
  45. Status Push(SqStack &S,SElemType e)
  46. { // 插入元素e为新的栈顶元素
  47. if(S.top-S.base==S.stacksize) return ERROR;
  48. *S.top++=e;
  49. return OK;
  50. }
  51. Status Pop(SqStack &S,SElemType &e)
  52. { // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
  53. if(S.top!=S.base)
  54. {
  55. e=*--S.top;
  56. return OK;
  57. }
  58. else return ERROR;
  59. }
  60. Status StackTraverse(SqStack S,Status(*visit)(SElemType))
  61. { // 从栈底到栈顶依次对栈中每个元素调用函数visit()。
  62. // 一旦visit()失败,则操作失败
  63. while(S.top>S.base)
  64. visit(*S.base++);
  65. printf("\n");
  66. return OK;
  67. }
  68. Status visit(SElemType c)
  69. {
  70. printf("%c",c);
  71. return OK;
  72. }
  73. void LineEdit()
  74. { // 利用字符栈s,从终端接收一行并送至调用过程的数据区。算法3.2
  75. SqStack s;
  76. char ch,c;
  77. int n,i;
  78. InitStack(s);
  79. scanf("%d",&n);
  80. ch=getchar();
  81. for(i=1;i<=n;i++)
  82. { ch=getchar();
  83. while(ch!='\n')
  84. {
  85. switch(ch)
  86. {
  87. case '#':Pop(s,c);
  88. break; // 仅当栈非空时退栈
  89. case '@':ClearStack(s);
  90. break; // 重置s为空栈
  91. default :Push(s,ch); // 有效字符进栈
  92. }
  93. ch=getchar(); // 从终端接收下一个字符
  94. }
  95. StackTraverse(s,visit); // 将从栈底到栈顶的栈内字符输出
  96. ClearStack(s); // 重置s为空栈
  97. }
  98. DestroyStack(s);
  99. }
  100. int main()
  101. {
  102. LineEdit();
  103. return 0;
  104. }

18938 汉诺塔问题

  1. //汉诺塔问题,打印的是整个的移动过程
  2. #include <stdio.h>
  3. void hanoi(int n, char A, char B, char C)//n个圈圈在柱子A上,借助柱子B,移动到柱子C上
  4. {
  5. if (n == 1)//如果A柱子上只有一个圈圈,直接移动到B上
  6. printf("%c->%d->%c\n", A,n, B);
  7. else
  8. {
  9. hanoi(n - 1, A, C, B);//将A柱子上的n-1个圈圈,借助柱子B,移动到柱子C上
  10. printf("%c->%d->%c\n", A, n,B);//将A柱子上的最后一个圈圈移动到柱子B上
  11. hanoi(n - 1, C, B, A);//将C柱子上的n-1个圈圈,借助柱子A,移动到柱子B上
  12. }
  13. }
  14. int main()
  15. {
  16. int n;
  17. char a, b, c;
  18. scanf("%d %c %c %c",&n,&a,&b,&c);
  19. if (n >= 20||n<=0) {
  20. return 0;
  21. }
  22. hanoi(n, a, b, c);
  23. return 0;
  24. }

18937 阿克曼(Ackmann)函数

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int akm(int m,int n){
  5. if(m==0){
  6. return n+1;
  7. }else if(m>0&&n==0){
  8. return akm(m-1,1);
  9. }else if(m>0&&n>0){
  10. return akm(m-1,akm(m,n-1));
  11. }
  12. }
  13. int main(){
  14. int n,m;
  15. cin>>m>>n;
  16. cout<<akm(m,n);
  17. return 0;
  18. }

实验3

8591 计算next值

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "iostream"
  4. #define MAXSTRLEN 255 // 用户可在255以内定义最大串长
  5. typedef unsigned char SString[MAXSTRLEN+1]; // 0号单元存放串的长度
  6. void get_next(SString T,int next[]){
  7. // 算法4.7
  8. // 求模式串T的next函数值并存入数组next
  9. // 请补全代码
  10. int i=1;
  11. next[1]=0;
  12. int j=0;
  13. while(i<=T[0])
  14. {
  15. if(j==0||T[i]==T[j])
  16. {
  17. ++i;++j;
  18. next[i]=j;
  19. }
  20. else j=next[j];
  21. }
  22. }
  23. int main(){
  24. int next[MAXSTRLEN];
  25. SString S;
  26. int n,i,j;
  27. char ch;
  28. scanf("%d",&n); // 指定要验证NEXT值的字符串个数
  29. ch=getchar();
  30. for(i=1;i<=n;i++)
  31. {
  32. ch=getchar();
  33. for(j=1;j<=MAXSTRLEN&&(ch!='\n');j++) // 录入字符串
  34. {
  35. S[j]=ch;
  36. ch=getchar();
  37. }
  38. S[0]=j-1; // S[0]用于存储字符串中字符个数
  39. get_next(S,next);
  40. printf("NEXT J is:");
  41. for(j=1;j<=S[0];j++)
  42. printf("%d",next[j]);
  43. printf("\n");
  44. }
  45. return 0;
  46. }

8592 KMP算法

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include "iostream"
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define ERROR 0
  8. #define INFEASLBLE -1
  9. #define OVERFLOW -2
  10. #define MAXSTRLEN 255 //用户可在255以内定义最大串长
  11. typedef unsigned char SString[MAXSTRLEN+1]; //0号单元存放串的长度
  12. void get_next(SString T,int next[]){
  13. // 算法4.7
  14. // 求模式串T的next函数值并存入数组next
  15. // 请补全代码
  16. int i=1,j=0;
  17. next[1]=0;
  18. while(i<=T[0])
  19. {
  20. if(j==0||T[i]==T[j])
  21. {
  22. ++i;++j;
  23. next[i]=j;
  24. }
  25. else
  26. j=next[j];
  27. }
  28. }
  29. int Index_KMP(SString S,SString T,int pos,int next[]){
  30. // 算法4.6
  31. // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置
  32. // KMP算法。请补全代码
  33. int i=pos;
  34. int j=1;
  35. while(i<=S[0]&&j<=T[0])
  36. {
  37. if(j==0||S[i]==T[j])
  38. {
  39. ++j;
  40. ++i;
  41. }
  42. else
  43. j=next[j];
  44. }
  45. if(j>T[0]) return i-T[0];
  46. else return 0;
  47. }
  48. int main()
  49. {
  50. SString T,S;
  51. int i,j,n;
  52. char ch;
  53. int pos;
  54. int next[MAXSTRLEN];
  55. scanf("%d",&n); // 指定n对需进行模式匹配的字符串
  56. ch=getchar();
  57. for(j=1;j<=n;j++)
  58. {
  59. ch=getchar();
  60. for( i=1;i<=MAXSTRLEN&&(ch!='\n');i++) // 录入主串
  61. {
  62. S[i]=ch;
  63. ch=getchar();
  64. }
  65. S[0]=i-1; // S[0]用于存储主串中字符个数
  66. ch=getchar();
  67. for( i=1;i<=MAXSTRLEN&&(ch!='\n');i++) // 录入模式串
  68. {
  69. T[i]=ch;
  70. ch=getchar();
  71. }
  72. T[0]=i-1; // T[0]用于存储模式串中字符个数
  73. get_next(T,next);
  74. pos=Index_KMP(S,T,1,next); // 请填空
  75. printf("%d\n",pos);
  76. }
  77. }

18769 不完整的排序

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<stdlib.h>
  4. #include<iostream>
  5. using namespace std;
  6. int b[100005];
  7. int main()
  8. {
  9. int n;
  10. scanf("%d",&n);
  11. for(int i=0;i<n;i++)
  12. {
  13. int m;
  14. scanf("%d",&m);
  15. int* a=new int[m];
  16. for(int j=0;j<m;j++)
  17. {
  18. cin>>a[j];
  19. }
  20. int *p,*q;
  21. p=a;
  22. q=p+m-1;
  23. while(p<q)
  24. {
  25. while(*p<0&&p<q) p++;
  26. while(*q>0&&p<q) q--;
  27. int temp=*p;
  28. *p=*q;
  29. *q=temp;
  30. }
  31. for(int t=0;t<m;t++)
  32. {
  33. printf("%d ",a[t]);
  34. }
  35. printf("\n");
  36. }
  37. return 0;
  38. }

实验4

8606 二叉树的构建及遍历操作

  1. #include "stdio.h"
  2. #include "malloc.h"
  3. #include <iostream>
  4. #define TRUE 1
  5. #define FALSE 0
  6. #define OK 1
  7. #define ERROR 0
  8. #define INFEASIBLE -1
  9. #define OVERFLOW -2
  10. typedef int Status;
  11. using namespace std;
  12. typedef char ElemType;
  13. typedef struct BiTNode{
  14. ElemType data;
  15. struct BiTNode *lchild,*rchild;//左右孩子指针
  16. } BiTNode,*BiTree;
  17. Status CreateBiTree(BiTree &T) { // 算法6.4
  18. // 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
  19. // 构造二叉链表表示的二叉树T。
  20. char ch;
  21. scanf("%c",&ch);
  22. if (ch=='#') T = NULL;
  23. else {
  24. if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
  25. T->data=ch; // 生成根结点
  26. CreateBiTree(T->lchild); // 构造左子树
  27. CreateBiTree((T->rchild)); // 构造右子树
  28. }
  29. return OK;
  30. } // CreateBiTree
  31. Status PreOrderTraverse( BiTree T) {
  32. // 前序遍历二叉树T的递归算法
  33. //补全代码,可用多个语句
  34. if(T)
  35. {
  36. cout<<T->data;
  37. PreOrderTraverse(T->lchild);
  38. PreOrderTraverse(T->rchild);
  39. }
  40. } // PreOrderTraverse
  41. Status InOrderTraverse( BiTree T) {
  42. // 中序遍历二叉树T的递归算法
  43. //补全代码,可用多个语句
  44. if(T)
  45. {
  46. InOrderTraverse(T->lchild);
  47. cout<<T->data;
  48. InOrderTraverse(T->rchild);
  49. }
  50. } // InOrderTraverse
  51. Status PostOrderTraverse( BiTree T) {
  52. // 后序遍历二叉树T的递归算法
  53. //补全代码,可用多个语句
  54. if(T)
  55. {
  56. PostOrderTraverse(T->lchild);
  57. PostOrderTraverse(T->rchild);
  58. cout<<T->data;
  59. }
  60. } // PostOrderTraverse
  61. int main() //主函数
  62. {
  63. BiTree T;
  64. CreateBiTree(T);
  65. PreOrderTraverse(T);
  66. cout<<endl;
  67. InOrderTraverse(T);
  68. cout<<endl;
  69. PostOrderTraverse(T);
  70. cout<<endl;
  71. return 0;
  72. //补充代码
  73. }//main

17121 求二叉树各种节点数

  1. #include "stdio.h"
  2. #include "malloc.h"
  3. #define TRUE 1
  4. #define FALSE 0
  5. #define OK 1
  6. #define ERROR 0
  7. #define INFEASIBLE -1
  8. #define OVERFLOW -2
  9. #include <iostream>
  10. using namespace std;
  11. typedef int Status;
  12. typedef char ElemType;
  13. typedef struct BiTNode{
  14. ElemType data;
  15. struct BiTNode *lchild,*rchild;//左右孩子指针
  16. } BiTNode,*BiTree;
  17. Status CreateBiTree(BiTree &T,int &count0,int &count1,int &count2) { // 算法6.4
  18. // 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
  19. // 构造二叉链表表示的二叉树T。
  20. char ch;
  21. scanf("%c",&ch);
  22. if (ch=='#') T = NULL;
  23. else {
  24. if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
  25. T->data=ch; // 生成根结点
  26. CreateBiTree(T->lchild,count0,count1,count2); // 构造左子树
  27. CreateBiTree(T->rchild,count0,count1,count2); // 构造右子树
  28. if(!T->lchild&&!T->rchild) count0++;
  29. else if((T->lchild&&!T->rchild)||(!T->lchild&&T->rchild)) count1++;
  30. else if(T->lchild&&T->rchild) count2++;
  31. }
  32. return OK;
  33. } // CreateBiTree
  34. int main() //主函数
  35. {
  36. BiTree T;
  37. int count0=0,count1=0,count2=0;
  38. CreateBiTree(T,count0,count1,count2);
  39. cout<<count2<<endl;
  40. cout<<count1<<endl;
  41. cout<<count0<<endl;//补充代码
  42. return 0;
  43. }//main

18924 二叉树的宽度

  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<iostream>
  4. using namespace std;
  5. int level[55];
  6. struct tree
  7. {
  8. int p;
  9. int l;
  10. int r;
  11. }tree[100];
  12. void t(int p,int c)
  13. {
  14. tree[c].p=p;
  15. if(!tree[p].l)
  16. tree[p].l=c;
  17. else
  18. tree[p].r=c;
  19. }
  20. void h(int root,int c)
  21. {
  22. level[c]++;
  23. if(tree[root].l)
  24. h(tree[root].l,c+1);
  25. if(tree[root].r)
  26. h(tree[root].r,c+1);
  27. }
  28. int main()
  29. {
  30. int n;
  31. int x,y;
  32. int ans=0,root=0;
  33. cin>>n;
  34. for(int i=1;i<n;i++)
  35. {
  36. cin>>x>>y;
  37. t(x,y);
  38. }
  39. for(int i=1;i<=n;i++)
  40. {
  41. if(tree[i].p==0)
  42. {
  43. root=i;
  44. break;
  45. }
  46. }
  47. h(root,1);
  48. for(int i=1;i<=50;i++)
  49. {
  50. if(level[i]>ans)
  51. ans=level[i];
  52. }
  53. cout<<ans;
  54. return 0;

18724 二叉树的遍历运算

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. #define maxn 10000
  5. char pre[maxn],in[maxn],post[maxn];
  6. void Post(char pre[],char in[],int len,int root)
  7. {
  8. if(len<=0) return;
  9. int i=0;
  10. while(in[i]!=pre[0]) i++;
  11. Post(pre+1,in,i,root-(len-i-1)-1);
  12. Post(pre+1+i,in+i+1,len-i-1,root-1);
  13. post[root]=pre[0];
  14. }
  15. int main()
  16. {
  17. cin>>pre>>in;
  18. int len=strlen(in);
  19. Post(pre,in,len,len-1);
  20. cout<<post<<endl;
  21. return 0;
  22. }

18923 二叉树的直径

  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<iostream>
  4. using namespace std;
  5. typedef int ElemType;
  6. struct BiTNode
  7. {
  8. ElemType data;
  9. BiTNode *lchild,rchild;
  10. }BiTNode,*BiTree;
  11. void insertData(BiTree &T,ElemType data)
  12. {
  13. BiTree p=new BiTNode;
  14. P->data=data;
  15. p->lchild=NUll;
  16. p->rchild=NUll;
  17. if(T==NULL)
  18. T=p;
  19. else
  20. {
  21. if(T->lchild==NULL)
  22. T->lchild=p;
  23. else T->rchild=p;
  24. }
  25. }
  26. void PreOrderSearch(BiTree T,ElemType x,BiTree &result)
  27. {
  28. if(T)
  29. {
  30. if(T->data==x) result=T;
  31. PreOrderSearch(T->lchild,x,result);
  32. PreOrderSearch(T->rchild,x,result);
  33. }
  34. }
  35. int maxcount=0;
  36. int maxDepth(BiTree &T)
  37. {
  38. if(T==NULL)
  39. return 0;
  40. int leftdepth=maxDepth(T->lchild);
  41. int rightdepth=maxDepth(T->rchild);
  42. int count=leftdepth+rightdepth;
  43. maxcount=count>maxcount?count:maxcount;
  44. return leftdepth>rightdepth?leftdepth+1:rightdepth+1;
  45. }
  46. int main()
  47. {
  48. BiTree P=NULL;
  49. int n;
  50. cin>>n;
  51. n--;
  52. insertData(P,1);
  53. while(n--)
  54. {
  55. ElemType x,y;
  56. cin>>x>>y;
  57. BiTree res=NULL;
  58. PreOrderSearch(P,x,res);
  59. insertData(res,y);
  60. }
  61. maxDepth(P);
  62. cout>>maxcount;
  63. return 0;
  64. }

实验5

8610 顺序查找

  1. #include"malloc.h" /* malloc()等
  2. #include"stdio.h"
  3. #include"stdlib.h"
  4. typedef int ElemType;
  5. typedef struct /*静态查找表的顺序存储结构 */
  6. {
  7. ElemType *elem; /* 数据元素存储空间基址,建表时按实际长度分配,0号单元留空 */
  8. int length; /* 表长度 */
  9. }SSTable;
  10. void Creat_Seq(SSTable &ST,int n)
  11. { /* 操作结果: 构造一个含n个数据元素的静态顺序查找表ST(数据来自数组r) */
  12. int i,temp;
  13. ST.elem=(ElemType *)malloc((n+1) * sizeof(ElemType)); /* 动态生成n个数据元素空间(0号单元不用) */
  14. if(!(ST).elem)
  15. {
  16. printf("ERROR\n");
  17. exit(0);
  18. } /*内存分配失败结束程序*/
  19. for(i=1;i<=n;i++)
  20. {
  21. scanf("%d",&temp);
  22. *(ST.elem+i)=temp; /* 依次赋值给ST */
  23. }
  24. ST.length=n;
  25. }
  26. int Search_Seq(SSTable &ST,ElemType key)
  27. { /* 在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为 */
  28. /* 该元素在表中的位置,否则为0。算法9.1 */
  29. int i=ST.length;
  30. ST.elem[0]=key;
  31. while(ST.elem[i]!=key)
  32. {
  33. i--;
  34. }
  35. return i;
  36. }
  37. int main()
  38. {
  39. SSTable ST;
  40. int loc,key;
  41. int n;
  42. scanf("%d",&n);
  43. Creat_Seq(ST,n);
  44. //printf("Please input the key value:");
  45. scanf("%d",&key);
  46. loc = Search_Seq(ST,key);
  47. if(loc!=0)
  48. printf("The element position is %d.\n",loc);
  49. else
  50. printf("The element is not exist.\n");
  51. }

8621 二分查找

  1. #include<iostream>
  2. using namespace std;
  3. int n,key,mid;
  4. int binary(int a[],int n)
  5. {
  6. int low=0,high=n;
  7. while(low<=high)
  8. {
  9. mid=(low+high)/2;
  10. if(a[mid]==key)
  11. return 1;
  12. else if(key<a[mid])
  13. high=mid-1;
  14. else low=mid+1;
  15. }
  16. return 0;
  17. }
  18. int main()
  19. {
  20. cin>>n;
  21. int a[n+5];
  22. for(int i=0;i<n;i++)
  23. cin>>a[i];
  24. cin>>key;
  25. if(binary(a,n)) cout<<"The element position is "<<mid<<'.';
  26. else cout<<"The element is not exist.";
  27. }

8622 哈希查找

  1. #include"malloc.h" /* malloc()等 */
  2. #include"stdlib.h" /* exit() */
  3. #include"stdio.h"
  4. #define EQ(a,b) ((a)==(b))
  5. #define SUCCESS 1
  6. #define UNSUCCESS 0
  7. #define NULLKEY -1 /*哈希表无元素时值为-1*/
  8. typedef int ElemType;
  9. int length;
  10. typedef struct
  11. {
  12. ElemType *elem; /* 数据元素存储基址,动态分配数组 */
  13. int count; /* 当前数据元素个数 */
  14. }HashTable;
  15. void InitHashTable(HashTable *H)
  16. { /* 操作结果: 构造一个长度为length的哈希表,length为全局变量 */
  17. int i;
  18. (*H).count=0; /* 当前元素个数为0 */
  19. (*H).elem=(ElemType*)malloc(length*sizeof(ElemType));
  20. if(!(*H).elem)
  21. exit(0); /* 存储分配失败 */
  22. for(i=0;i<length;i++)
  23. (*H).elem[i]=NULLKEY; /* 未填记录的标志 */
  24. }
  25. unsigned Hash(ElemType K)
  26. { /* 一个简单的哈希函数*/
  27. return 3*k%length;
  28. }
  29. void collision(int *p) /*线性探测再散列 */
  30. { /* 开放定址法处理冲突 */
  31. *p=(*p+1)%length;
  32. }
  33. int SearchHash(HashTable H,ElemType K,int *p,int *c)
  34. { /* 在开放定址哈希表H中查找关键码为K的元素,若查找成功,以p指示待查数据 */
  35. /* 元素在表中位置,并返回SUCCESS;否则,以p指示插入位置,并返回UNSUCCESS */
  36. /* c用以计冲突次数,其初值置零,供建表插入时参考。算法9.17 */
  37. *p=Hash(K); /* 求得哈希地址 */
  38. while(H.elem[*p]!=NULLKEY&&!EQ(K,H.elem[*p]))
  39. { /* 该位置中填有记录,并且关键字不相等 */
  40. (*c)++;
  41. if(*c<length)
  42. collision(p); /* 求得下一探查地址p */
  43. else
  44. break;
  45. }
  46. if EQ(K,H.elem[*p])
  47. return SUCCESS; /* 查找成功,p返回待查数据元素位置 */
  48. else
  49. return UNSUCCESS; /* 查找不成功(H.elem[p].key==NULLKEY),p返回的是插入位置 */
  50. }
  51. int InsertHash(HashTable *H,ElemType e)
  52. { /* 查找不成功时插入数据元素e到开放定址哈希表H中,并返回查找长度 */
  53. int c,p;
  54. c=0;
  55. if(SearchHash(*H,e,&p,&c)) /* 表中已有与e有相同关键字的元素 */
  56. printf("哈希表中已有元素%d。\n",e);
  57. else{ /* 插入e */
  58. (*H).elem[p]=e;
  59. ++(*H).count;
  60. }
  61. return c+1; /*查找长度为冲突次数加1*/
  62. }
  63. void TraverseHash(HashTable H)
  64. { /* 按哈希地址的顺序打印哈希表,无元素位置用X表示 */
  65. int i;
  66. printf("HashTable Address:0~%d\n",length-1);
  67. for(i=0;i<length;i++)
  68. if(H.elem[i]==NULLKEY) /* 有数据 */
  69. printf("X ");
  70. else
  71. printf("%d ",H.elem[i]);
  72. printf("\n");
  73. }
  74. main()
  75. {
  76. float i=0,j=0;
  77. ElemType e;
  78. HashTable H;
  79. //printf("Input Table length:");
  80. scanf("%d",&length);
  81. InitHashTable(&H);
  82. //printf("Input key words sequence, -1 conclusion input:");
  83. scanf("%d",&e);
  84. while(e!=-1)
  85. {
  86. j ++; /*j记录输入元素个数*/
  87. i = i + InsertHash(&H,e); /*i记录查找长度的和*/
  88. scanf("%d",&e);
  89. }
  90. TraverseHash(H);
  91. printf("Average search length=%f\n",i/j);
  92. }

实验6

直接插入排序

  1. #include<iostream>
  2. using namespace std;
  3. void InsertSort(int *a,int n)
  4. {
  5. for(int i=2;i<=n;i++)
  6. {
  7. if(a[i]<a[i-1])
  8. {
  9. a[0]=a[i];
  10. a[i]=a[i-1];
  11. int j;
  12. for(j=i-1;a[0]<a[j-1];j--)
  13. {
  14. a[j]=a[j-1];
  15. }
  16. a[j]=a[0];
  17. for(int k=1;k<=n;k++)
  18. {
  19. cout<<a[k]<<' ';
  20. }
  21. cout<<endl;
  22. }
  23. }
  24. }
  25. int main()
  26. {
  27. int a[1000];
  28. int n;
  29. cin>>n;
  30. for(int i=1;i<=n;i++)
  31. {
  32. cin>>a[i];
  33. }
  34. InsertSort(a,n);
  35. }

折半插入排序

  1. #include<iostream>
  2. using namespace std;
  3. void BinSort(int *a,int n)
  4. {
  5. for(int i=2;i<=n;i++)
  6. {
  7. int low=1,high=i-1,mid;
  8. a[0]=a[i];
  9. while(low<=high)
  10. {
  11. mid=(low+high)/2;
  12. if(a[0]<a[mid]) high=mid-1;
  13. else low=mid+1;
  14. }
  15. for(int j=i;j>high+1;j--) a[j]=a[j-1];
  16. a[high+1]=a[0];
  17. for(int k=1;k<=n;k++) cout<<a[k]<<' ';
  18. cout<<endl;
  19. }
  20. }
  21. int main()
  22. {
  23. int n,a[10000];
  24. cin>>n;
  25. for(int i=1;i<=n;i++)
  26. cin>>a[i];
  27. BinSort(a,n);
  28. return 0;
  29. }


shell排序

  1. #include<iostream>
  2. using namespace std;
  3. void ShellSort(int a[],int n)
  4. {
  5. int temp;
  6. int d=n/2;
  7. while(d)
  8. {
  9. for(int i=d;i<n;i++)
  10. {
  11. temp=a[i];
  12. int j=i;
  13. while(j>=d&&temp<a[j-d])
  14. {
  15. a[j]=a[j-d];
  16. j-=d;
  17. }
  18. a[j]=temp;
  19. }
  20. d=d/2;
  21. for(int k=0;k<n;k++)
  22. cout<<a[k]<<' ';
  23. cout<<endl;
  24. }
  25. }
  26. int main()
  27. {
  28. int n,a[100000];
  29. cin>>n;
  30. for(int i=0;i<n;i++)
  31. cin>>a[i];
  32. ShellSort(a,n);
  33. }

冒泡排序

  1. #include<iostream>
  2. using namespace std;
  3. void BubbleSort(int *a,int n)
  4. {
  5. int end=n-1;
  6. bool flag=1;
  7. while(end>0&&flag)
  8. {
  9. flag=false;
  10. for(int i=1;i<=end;i++)
  11. {
  12. if(a[i]>a[i+1])
  13. {
  14. int temp=a[i];
  15. a[i]=a[i+1];
  16. a[i+1]=temp;
  17. flag=true;
  18. }
  19. }
  20. end--;
  21. for(int k=1;k<=n;k++)
  22. cout<<a[k]<<' ';
  23. cout<<endl;
  24. }
  25. }
  26. int main()
  27. {
  28. int n,a[10000];
  29. cin>>n;
  30. for(int i=1;i<=n;i++)
  31. cin>>a[i];
  32. BubbleSort(a,n);
  33. return 0;
  34. }

快速排序

  1. #include<iostream>
  2. using namespace std;
  3. int Part(int *a,int l,int r)
  4. {
  5. a[0]=a[l];
  6. int q=a[l];
  7. while(l<r)
  8. {
  9. while(a[r]>=q&&l<r) r--;
  10. a[l]=a[r];
  11. while(a[l]<=q&&l<r) l++;
  12. a[r]=a[l];
  13. }
  14. a[l]=a[0];
  15. return l;
  16. }
  17. void QSort(int *a,int l,int r,int len)
  18. {
  19. if(l<r)
  20. {
  21. int p=Part(a,l,r);
  22. for(int k=1;k<=len;k++)
  23. cout<<a[k]<<' ';
  24. cout<<endl;
  25. QSort(a,l,p-1,len);
  26. QSort(a,p+1,r,len);
  27. }
  28. }
  29. int main()
  30. {
  31. int n,a[10000];
  32. cin>>n;
  33. for(int i=1;i<=n;i++)
  34. cin>>a[i];
  35. QSort(a,1,n,n);
  36. return 0;
  37. }

简单选排

  1. #include<iostream>
  2. using namespace std;
  3. void Ssort(int *a,int len)
  4. {
  5. for(int i=1;i<len;++i)
  6. {
  7. int k=i;
  8. for(int j=i+1;j<=len;++j)
  9. if(a[j]<a[k])
  10. k=j;
  11. int tmp=a[k];
  12. a[k]=a[i];
  13. a[i]=tmp;
  14. for(int k=1;k<=len;++k)
  15. cout<<a[k]<<' ';
  16. cout<<endl;
  17. }
  18. }
  19. int main()
  20. {
  21. int n,a[100000];
  22. cin>>n;
  23. for(int i=1;i<=n;i++)
  24. cin>>a[i];
  25. Ssort(a,n);
  26. return 0;
  27. }

堆排序

  1. #include<iostream>
  2. using namespace std;
  3. void Adjust(int *a,int s,int len)
  4. {
  5. int rc=a[s];
  6. for(int i=2*s;i<=len;i=i*2)
  7. {
  8. if(a[i]<a[i+1]&&i<len)
  9. i++;
  10. if(rc<a[i])
  11. {
  12. a[s]=a[i];
  13. s=i;
  14. }
  15. }
  16. a[s]=rc;
  17. }
  18. void CreatHeap(int *a,int len)
  19. {
  20. for(int i=len/2;i>0;i--)
  21. {
  22. Adjust(a,i,len);
  23. }
  24. }
  25. void StackSort(int *a,int len)
  26. {
  27. CreatHeap(a,len);
  28. for(int i=len;i>1;i--)
  29. {
  30. for(int k=1;k<=len;k++)
  31. cout<<a[k]<<' ';
  32. cout<<endl;
  33. int temp=a[1];
  34. a[1]=a[i];
  35. a[i]=temp;
  36. Adjust(a,1,i-1);
  37. }
  38. }
  39. int main()
  40. {
  41. int n,a[100000];
  42. cin>>n;
  43. for(int i=1;i<=n;i++)
  44. {
  45. cin>>a[i];
  46. }
  47. StackSort(a,n);
  48. for(int k=1;k<=n;k++)
  49. cout<<a[k]<<' ';
  50. return 0;
  51. }

归并

  1. #include<iostream>
  2. using namespace std;
  3. int n;
  4. void Merge(int a[],int l,int m,int r)
  5. {
  6. int *p=new int [r-l+10];
  7. int i=l,j=m+1,k=0;
  8. while(i<=m&&j<=r)
  9. {
  10. if(a[i]>=a[j]) p[k++]=a[j++];
  11. else p[k++]=a[i++];
  12. }
  13. while(i<=m) p[k++]=a[i++];
  14. while(j<=r) p[k++]=a[j++];
  15. for(i=l,k=0;i<=r;i++,k++)
  16. {
  17. a[i]=p[k];
  18. }
  19. delete[]p;
  20. }
  21. void group_two(int a[],int gap)
  22. {
  23. int i=1;
  24. while(i+2*gap<n)
  25. {
  26. Merge(a,i,i+gap-1,i+2*gap-1);
  27. i=i+2*gap;
  28. }
  29. if(i+gap-1<n) Merge(a,i,i+gap-1,n);
  30. }
  31. void Msort(int a[])
  32. {
  33. for(int gap=1;gap<n;gap*=2)
  34. {
  35. group_two(a,gap);
  36. for(int k=1;k<=n;k++)
  37. cout<<a[k]<<' ';
  38. cout<<endl;
  39. }
  40. }
  41. int main()
  42. {
  43. int a[10000];
  44. cin>>n;
  45. for(int i=1;i<=n;i++)
  46. {
  47. cin>>a[i];
  48. }
  49. Msort(a);
  50. return 0;
  51. }*/

实验7

图的存储结构

  1. #include <iostream>
  2. using namespace std;
  3. #define num 100
  4. int arr[num][num];
  5. int main()
  6. {
  7. int a,b;
  8. cin>>a>>b;
  9. for(int i=0;i<b;i++)
  10. {
  11. int v1,v2;
  12. cin>>v1>>v2;
  13. arr[v1][v2]=1;
  14. }
  15. for(int i=1;i<=a;i++)
  16. {
  17. for(int j=1;j<=a;j++)
  18. {
  19. cout<<arr[i][j]<<' ';
  20. }
  21. cout<<endl;
  22. }
  23. return 0;
  24. }*/

图的深度/广度遍历

  1. #include<iostream>
  2. #include<queue>
  3. #include<vector>
  4. using namespace std;
  5. int book[10000]={0};
  6. vector<int>e[10000];
  7. void dfs(int z)
  8. {
  9. cout<<(char)(z+'a')<<" ";
  10. int len=e[z].size();
  11. for(int i=0;i<len;i++)
  12. {
  13. int y=e[z][i];
  14. if(book[y]==0)
  15. {
  16. book[y]=1;
  17. dfs(y);
  18. }
  19. }
  20. return ;
  21. }
  22. void bfs(int z)
  23. {
  24. queue<int>q;
  25. q.push(z);
  26. while(!q.empty())
  27. {
  28. int r=q.front();
  29. q.pop();
  30. cout<<(char)(r+'a')<<" ";
  31. int len=e[r].size();
  32. for(int i=0;i<len;i++)
  33. {
  34. int y=e[r][i];
  35. if(book[y]==0)
  36. {
  37. book[y]=1;
  38. q.push(y);
  39. }
  40. }
  41. }
  42. return;
  43. }
  44. int main()
  45. {
  46. int t;
  47. cin>>t;
  48. int n,m;
  49. cin>>n>>m;
  50. int temp;
  51. for(int i=0;i<n;i++)
  52. {
  53. char x;
  54. cin>>x;
  55. }
  56. for(int i=0;i<m;i++)
  57. {
  58. char x,y;
  59. cin>>x>>y;
  60. int a=(char)(x-'a');
  61. int b=(char)(y-'a');
  62. if(i==0)
  63. temp=a;
  64. if(t<=1)
  65. e[a].insert(e[a].begin(),b);
  66. else
  67. {
  68. e[a].insert(e[a].begin(),b);
  69. e[b].insert(e[b].begin(),a);
  70. }
  71. }
  72. book[temp]=1;
  73. //选择遍历
  74. //dfs(temp);
  75. bfs(temp);
  76. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号