[关闭]
@wpaladins 2016-04-08T07:51:49.000000Z 字数 9678 阅读 1848

数据结构_C语言(三)

代码

My MiniPage[1]

本页面由王旭升(wpaladins)编写,转载请注明出处即可,无需申请!


目录

A

  1. #include<stdio.h> //A
  2. #include<string.h>
  3. struct xg
  4. {
  5. int xi;
  6. int ui;
  7. }a[10000],b[10000];
  8. int main()
  9. {
  10. int i,j,n=0,m=0;
  11. int sum[10000];
  12. memset(sum,0,sizeof(sum));
  13. while(1)
  14. {
  15. scanf("%d%d",&a[n].xi,&a[n].ui);
  16. if(a[n++].ui==-1)
  17. break;
  18. }
  19. while(1)
  20. {
  21. scanf("%d%d",&b[m].xi,&b[m].ui);
  22. if(b[m++].ui==-1)
  23. break;
  24. }
  25. for(i=0;i<n-1;i++)
  26. {
  27. for(j=0;j<m-1;j++)
  28. {
  29. sum[a[i].ui+b[j].ui]+=a[i].xi*b[j].xi;
  30. }
  31. }
  32. int flag=0;
  33. for(i=9999;i>=0;i--)
  34. {
  35. if(sum[i])
  36. {
  37. printf("%d %d ",sum[i],i);
  38. flag=1;
  39. }
  40. }
  41. if(flag==0)
  42. printf("0\n");
  43. return 0;
  44. }

B

代码2运用数学归纳法,由五班大神施维提供:

  1. #include<stdio.h> //B
  2. #include<string.h>
  3. int main()
  4. {
  5. int m,n,t,M;
  6. int a[10001];
  7. while(~scanf("%d%d",&m,&n)&&m&&n)
  8. {
  9. memset(a,0,sizeof(a));
  10. M=m-1;
  11. int i=1;
  12. while(M--)
  13. {
  14. t=0;
  15. for(;;i++)
  16. {
  17. if(!a[i])
  18. {
  19. t++;
  20. }
  21. if(t==n)
  22. {
  23. a[i]=1;
  24. break;
  25. }
  26. if(i==m)
  27. {
  28. i=0;
  29. }
  30. }
  31. }
  32. for( i=1;i<=m;i++)
  33. {
  34. if(a[i]==0)
  35. {
  36. printf("%d\n",i);
  37. break;
  38. }
  39. }
  40. }
  41. return 0;
  42. }

代码2

  1. #include<stdio.h>
  2. int main ()
  3. {
  4. int s,n,i,m;
  5. while((scanf("%d%d",&n,&m))&&n&&m)
  6. {
  7. s=0;
  8. for(i=2;i<=n;i++)
  9. {
  10. s=(s+m)%i;
  11. }
  12. printf("%d\n",s+1);
  13. }
  14. return 0;
  15. }

C

  1. #include<stdio.h>
  2. #include<string.h>
  3. struct xg
  4. {
  5. int xi;
  6. int ui;
  7. }a[10000],b[10000];
  8. int main()
  9. {
  10. int i,j,n=0,m=0;
  11. int sum[10000];
  12. memset(sum,0,sizeof(sum));
  13. while(1)
  14. {
  15. scanf("%d%d",&a[n].xi,&a[n].ui);
  16. if(a[n++].ui==-1)
  17. break;
  18. }
  19. while(1)
  20. {
  21. scanf("%d%d",&b[m].xi,&b[m].ui);
  22. if(b[m++].ui==-1)
  23. break;
  24. }
  25. for(i=0;i<n-1;i++)
  26. {
  27. sum[a[i].ui]+=a[i].xi;
  28. }
  29. for(j=0;j<m-1;j++)
  30. {
  31. sum[b[j].ui]+=b[j].xi;
  32. }
  33. int flag=0;
  34. for(i=9999;i>=0;i--)
  35. {
  36. if(sum[i])
  37. {
  38. printf("%d %d ",sum[i],i);
  39. flag=1;
  40. }
  41. }
  42. if(flag==0)
  43. printf("0\n");
  44. return 0;
  45. }

D

代码2版本

  1. #include<stdio.h> //D
  2. #include<string.h>
  3. int main()
  4. {
  5. int i,j,m,n;
  6. int a[210],b[210]; //数组,所以是线性表;
  7. while(~scanf("%d",&m)) //用第一个输入的数据在while中的方法达到输入多组数据的效果,注意写法;
  8. {
  9. for(i=0;i<m;i++)
  10. {
  11. scanf("%d",&a[i]); //为数组a的每个元素赋值;
  12. }
  13. scanf("%d",&n); //数组b的大小
  14. for(i=0;i<n;i++)
  15. {
  16. scanf("%d",&b[i]); //为数组b的每个元素赋值;
  17. }
  18. printf("%d",a[0]); //从此开始的八行,按照体重要求打印一次数组a和b,但是由于空格的问题,就必须将第一个数据单独打出,剩下的数据以" %d"的形式打出;
  19. for(i=1;i<m;i++)
  20. printf(" %d",a[i]);
  21. printf("\n");
  22. printf("%d",b[0]);
  23. for(i=1;i<n;i++)
  24. printf(" %d",b[i]);
  25. printf("\n");
  26. for(i=0;i<n;i++) //用i来遍历b;
  27. {
  28. int t=0;
  29. for(j=0;j<m;j++) //用i来遍历a;
  30. {
  31. if(a[j]==b[i])
  32. {
  33. t=1;
  34. break;
  35. }
  36. }
  37. if(t==0)
  38. {
  39. a[m++]=b[i]; //先将b[i]的值赋给a[m],然后m++;
  40. }
  41. printf("%d",a[0]); //从此开始的四行,是为了将数组在每次加完一个数之后输出;
  42. for(j=1;j<m;j++)
  43. printf(" %d",a[j]);
  44. printf("\n");
  45. }
  46. printf("\n"); //按照题目要求,每组数据之间换行;
  47. }
  48. return 0;
  49. }

代码2

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define OK 1
  4. #define ERROR 0
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define MAXSIZE 201
  8. typedef int Status;
  9. typedef int ElemType;
  10. Status visit(ElemType c)
  11. {
  12. printf(" %d",c);
  13. return OK;
  14. }
  15. typedef struct
  16. {
  17. ElemType data[MAXSIZE];
  18. int length;
  19. }SqList;
  20. Status InitList(SqList *L)
  21. {
  22. L->length=0;
  23. return OK;
  24. }Status ListEmpty(SqList L)
  25. {
  26. if(L.length==0)
  27. return TRUE;
  28. else
  29. return FALSE;
  30. }
  31. Status ClearList(SqList *L)
  32. {
  33. L->length=0;
  34. return OK;
  35. }
  36. int ListLength(SqList L)
  37. {
  38. return L.length;
  39. }
  40. Status GetElem(SqList L,int i,ElemType *e)
  41. {
  42. if(L.length==0 || i<1 || i>L.length)
  43. return ERROR;
  44. *e=L.data[i-1];
  45. return OK;
  46. }
  47. int LocateElem(SqList L,ElemType e)
  48. {
  49. int i;
  50. if (L.length==0)
  51. return 0;
  52. for(i=0;i<L.length;i++)
  53. {
  54. if (L.data[i]==e)
  55. break;
  56. }
  57. if(i>=L.length)
  58. return 0;
  59. return i+1;
  60. }
  61. Status ListInsert(SqList *L,int i,ElemType e)
  62. {
  63. int k;
  64. if (L->length==MAXSIZE)
  65. return ERROR;
  66. if (i<1 || i>L->length+1)
  67. return ERROR;
  68. if (i<=L->length)
  69. {
  70. for(k=L->length-1;k>=i-1;k--)
  71. L->data[k+1]=L->data[k];
  72. }
  73. L->data[i-1]=e;
  74. L->length++;
  75. return OK;
  76. }
  77. Status ListDelete(SqList *L,int i,ElemType *e)
  78. {
  79. int k;
  80. if (L->length==0)
  81. return ERROR;
  82. if (i<1 || i>L->length)
  83. return ERROR;
  84. *e=L->data[i-1];
  85. if (i<L->length)
  86. {
  87. for(k=i;k<L->length;k++)
  88. L->data[k-1]=L->data[k];
  89. }
  90. L->length--;
  91. return OK;
  92. }
  93. void ListTraverse(SqList L)
  94. {
  95. int i;
  96. printf("%d", L.data[0]);
  97. for(i=1;i<L.length;i++)
  98. visit(L.data[i]);
  99. printf("\n");
  100. }
  101. void unionL(SqList *La,ElemType c)
  102. {
  103. int La_len,i;
  104. La_len=ListLength(*La);
  105. if (!LocateElem(*La,c))
  106. ListInsert(La,++La_len,c);
  107. }
  108. int main()
  109. {
  110. SqList La, Lb;
  111. InitList(&La);
  112. InitList(&Lb);
  113. int m, n, i, num, Lb_len;
  114. while(scanf("%d", &m) != EOF){
  115. for(i = 0;i < m; i++){
  116. scanf("%d", &num);
  117. ListInsert(&La, i+1, num);
  118. }
  119. scanf("%d", &n);
  120. for
  121. (i = 0;i < n; i++){
  122. scanf("%d", &num);
  123. ListInsert(&Lb, i+1, num);
  124. }
  125. Lb_len=ListLength(Lb);
  126. ListTraverse(La);
  127. ListTraverse(Lb);
  128. ElemType e;
  129. for(i = 1; i <= Lb_len; i++){
  130. GetElem(Lb,i,&e);
  131. unionL(&La, e);
  132. ListTraverse (La);
  133. }
  134. printf("\n");
  135. ClearList(&La);
  136. ClearList(&Lb);
  137. }
  138. }

E

  1. #include<stdio.h> //E
  2. #include<string.h>
  3. int main()
  4. {
  5. int i,n,m;
  6. int a[101],b[101],z[202];
  7. int p=0,q=0;
  8. scanf("%d",&n);
  9. for(i=0;i<n;i++)
  10. {
  11. scanf("%d",&a[i]);
  12. }
  13. scanf("%d",&m);
  14. for(i=0;i<m;i++)
  15. {
  16. scanf("%d",&b[i]);
  17. }
  18. if(a[0]>b[0])
  19. {
  20. z[0]=b[0];
  21. q=1;
  22. }
  23. else
  24. {
  25. z[0]=a[0];
  26. p=1;
  27. }
  28. printf("%d ",z[0]);
  29. for(i=1;i<m+n;i++)
  30. {
  31. if(p==n&&q==m)
  32. break;
  33. if(a[p]<b[q])
  34. {
  35. if(p<n)
  36. z[i]=a[p++];
  37. else
  38. z[i]=b[q++];
  39. }
  40. else
  41. {
  42. if(q<m)
  43. z[i]=b[q++];
  44. else
  45. z[i]=a[p++];
  46. }
  47. printf("%d",z[i]);
  48. if(i!=m+n-1)
  49. printf(" ");
  50. }
  51. return 0;
  52. }

F

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量
  5. #define LISTINCREMENT 10 // 线性表存储空间的分配增量
  6. typedef int Status; // 定义返回值状态类型
  7. #define OK 1
  8. #define ERROR 0
  9. typedef struct{ // 定义数据类型,存放的是一个名字,所以只有字符数组
  10. char name[100];
  11. }ElemType;
  12. typedef struct{
  13. ElemType * elem; // 存储空间基址
  14. int length; // 当前长度
  15. int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
  16. }SqList;
  17. Status InitList_Sq(SqList *L) { // 算法2.3
  18. // 构造一个空的线性表L。
  19. L->elem = (ElemType *) malloc(LIST_INIT_SIZE*sizeof(ElemType));
  20. if (!L->elem)
  21. 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) { // 算法2.4
  27. // 在顺序线性表L的第i个元素之前插入新的元素e,
  28. // i的合法值为1≤i≤ListLength_Sq(L)+1
  29. ElemType *p;
  30. if (i < 1 || i > L->length + 1)
  31. return ERROR; // i值不合法
  32. if (L->length >= L->listsize) { // 当前存储空间已满,增加容量
  33. ElemType *newbase = (ElemType *) realloc(L->elem, (L->listsize
  34. + LISTINCREMENT) * sizeof(ElemType));
  35. if (!newbase)
  36. return ERROR; // 存储分配失败
  37. L->elem = newbase; // 新基址
  38. L->listsize += LISTINCREMENT; // 增加存储容量
  39. }
  40. ElemType *q = &(L->elem[i - 1]); // q为插入位置
  41. for (p = &(L->elem[L->length - 1]); p >= q; --p)
  42. *(p + 1) = *p;
  43. // 插入位置及之后的元素右移
  44. *q = e; // 插入e
  45. ++L->length; // 表长增1
  46. return OK;
  47. } // ListInsert_Sq
  48. Status ListDelete_Sq(SqList *L, int i, ElemType *e) { // 算法2.5
  49. // 在顺序线性表L中删除第i个元素,并用e返回其值。
  50. // i的合法值为1≤i≤ListLength_Sq(L)。
  51. ElemType *p, *q;
  52. if (i < 1 || i > L->length)
  53. return ERROR; // i值不合法
  54. p = &(L->elem[i - 1]); // p为被删除元素的位置
  55. *e = *p; // 被删除元素的值赋给e
  56. q = L->elem + L->length - 1; // 表尾元素的位置
  57. for (++p; p <= q; ++p)
  58. *(p - 1) = *p; // 被删除元素之后的元素左移
  59. --L->length; // 表长减1
  60. return OK;
  61. } // ListDelete_Sq
  62. int LocateElem_Sq(SqList L, ElemType e, Status(*compare)(ElemType, ElemType)) { // 算法2.6
  63. // 在顺序线性表L中查找第1个值与e满足compare()的元素的位序。
  64. // 若找到,则返回其在L中的位序,否则返回0。
  65. int i;
  66. ElemType *p;
  67. i = 1; // i的初值为第1个元素的位序
  68. p = L.elem; // p的初值为第1个元素的存储位置
  69. while (i <= L.length && !(*compare)(*p++, e))
  70. ++i;
  71. if (i <= L.length)
  72. return i;
  73. else
  74. return 0;
  75. } // LocateElem_Sq
  76. void ListShow(SqList L){
  77. // 将顺序表中的所有元素都显示出来,每个姓名之间用空格分开
  78. int i;
  79. for(i=0;i<L.length;i++){
  80. if(i){ // 用来判断是否需要输出空格
  81. putchar(' ');
  82. }
  83. printf("%s", L.elem[i].name); // 输出姓名
  84. }
  85. putchar('\n'); // 注意最后需要换行
  86. }
  87. Status cmp(ElemType e1, ElemType e2){
  88. // 用来比较两个ElemType元素是否相等
  89. return (Status)!strcmp(e1.name, e2.name);
  90. }
  91. int main(){
  92. SqList namelist; // 定义姓名列表
  93. InitList_Sq(&namelist); // 初始化姓名列表
  94. char strInstruct[10]; // 用来保存每行开头的指令
  95. int pos; // 用来保存插入或者搜索的位置
  96. ElemType e; // 用来保存姓名的节点
  97. while(scanf("%s", strInstruct) != EOF){
  98. if(strcmp(strInstruct, "insert") == 0){ // 插入姓名
  99. scanf("%d%s" ,&pos, e.name); // 读取待插入的位置与姓名
  100. ListInsert_Sq(&namelist, pos, e); // 将姓名插入到pos之前
  101. }else if(strcmp(strInstruct, "show") == 0){ // 显示列表中所有的元素
  102. ListShow(namelist);
  103. }else if(strcmp(strInstruct, "delete") == 0){ // 删除某个姓名
  104. scanf("%s", e.name); // 读取需要删除的元素
  105. // 先查找这个姓名在列表中的位置
  106. // 然后调用 ListDelete_Sq 删除该元素
  107. pos = LocateElem_Sq(namelist, e, cmp);
  108. ListDelete_Sq(&namelist, pos, &e);
  109. }else if(strcmp(strInstruct, "search") == 0){ // 查找某个姓名的位置
  110. scanf("%s", e.name); // 读取需要查找的元素
  111. printf("%d\n", LocateElem_Sq(namelist, e, cmp));
  112. }
  113. }
  114. return 0;
  115. }

G

H

  1. #include<stdio.h> //H
  2. #include<string.h>
  3. int nex[11]={2,0,3,4,5,6,7,8,9,10,0};
  4. char mem[11][10];
  5. int mal()
  6. {
  7. int i=nex[0];
  8. if(nex[0])
  9. {
  10. nex[0]=nex[nex[0]];
  11. }
  12. return i;
  13. }
  14. int len(char s[])
  15. {
  16. int i=0;
  17. while(s[i++]);
  18. return i;
  19. }
  20. void search(char s[])
  21. {
  22. int i=nex[1];
  23. while(i&&strcmp(s,mem[i]))
  24. i=nex[i];
  25. printf("%2d\n********************\n",i);
  26. return ;
  27. }
  28. void show()
  29. {
  30. int i,le;
  31. for(i=0;i<11;i++)
  32. {
  33. le=len(mem[i]);
  34. printf("%-8s%2d\n",mem[i],nex[i]);
  35. }
  36. printf("********************\n");
  37. return;
  38. }
  39. void insert(int w,char s[])
  40. {
  41. int p1=1,p2=nex[1];
  42. int r=mal();
  43. strcpy(mem[r],s);
  44. int t=1;
  45. while(t!=w)
  46. {
  47. p1=p2;
  48. p2=nex[p2];
  49. t++;
  50. }
  51. nex[r]=p2;
  52. nex[p1]=r;
  53. return;
  54. }
  55. void del(int w)
  56. {
  57. int p1=1,p2=nex[1];
  58. int t=1;
  59. while(t!=w)
  60. {
  61. p1=p2;
  62. p2=nex[p2];
  63. t++;
  64. }
  65. nex[p1]=nex[p2];
  66. nex[p2]=nex[0];
  67. nex[0]=p2;
  68. }
  69. int main()
  70. {
  71. char zo[10];
  72. int W;
  73. while(~scanf("%s",zo))
  74. {
  75. switch(zo[2])
  76. {
  77. case 'o':{
  78. show();
  79. break;
  80. }
  81. case 's':{
  82. scanf("%d%s",&W,zo);
  83. insert(W,zo);
  84. break;
  85. }
  86. case 'l':{
  87. scanf("%d",&W);
  88. del(W);
  89. break;
  90. }
  91. case 'a':{
  92. scanf("%s",zo);
  93. search(zo);
  94. break;
  95. }
  96. }
  97. }
  98. return 0;
  99. }

I

  1. #include<stdio.h> //I
  2. #include<malloc.h>
  3. struct nood //双向链表;
  4. {
  5. int val;
  6. struct nood *next;
  7. struct nood *front;
  8. }head,rear;
  9. int main()
  10. {
  11. int i,n,t;
  12. while(~scanf("%d",&n))
  13. {
  14. head.next=&rear;
  15. rear.front=&head;
  16. struct nood *p=&head;
  17. int b=0;
  18. for(i=0;i<n;i++) //插入操作
  19. {
  20. b=1;
  21. scanf("%d",&t);
  22. struct nood *r=(struct nood*)malloc(sizeof(struct nood));
  23. r->val=t;
  24. r->next=p->next;
  25. r->front=p;
  26. p->next->front=r;
  27. p->next=r;
  28. p=r;
  29. printf("%d ",t);
  30. }
  31. if(b==1)
  32. printf("\n");
  33. if(n==0)
  34. {
  35. printf("list is empty\n");
  36. continue;
  37. }
  38. p=rear.front;
  39. b=0;
  40. while(p!=&head)
  41. {
  42. printf("%d ",p->val);
  43. p=p->front;
  44. }
  45. printf("\n");
  46. }
  47. return 0;
  48. }

J

  1. #include<stdio.h> //J
  2. #include<malloc.h>
  3. struct nood
  4. {
  5. int val;
  6. struct nood *next;
  7. }head,rear; //定义了头结点和尾结点,全局变量;
  8. int main()
  9. {
  10. int i,n,t;
  11. int q=0; //q的作用主要是在每次打完原始数据后换行;
  12. while(~scanf("%d",&n)) //数据为多组,使用这个方式输入,需要按ctrl+z才能退出程序;
  13. {
  14. if(!q)
  15. q=1;
  16. head.next=&rear; //头结点的指针指向首个结点;
  17. struct nood *p=&head; //定义了一个结构体指针p(辅助的结点)并且将它跟头结点一样指向首个结点,用以遍历和插入;
  18. int b=0; //相当于flag,不参与运算,仅仅标志着一个变化;
  19. for(i=0;i<n;i++)
  20. {
  21. scanf("%d",&t); //读取即将存到现在结点的数据;
  22. struct nood *r=(struct nood*)malloc(sizeof(struct nood)); //申请一个新的空间,为要插入的结点;
  23. r->val=t; //将新的结点的val存上值;
  24. r->next=p->next; //第一次p为头结点,将为结点r的前一个结点,后来也将为结点r的前一个结点,p->next为&rear,此处的意思是在head 和rear之间插入元素;
  25. p->next=r; //让辅助结点p指向要插入的结点,为下一次结点p作为插入结点的前一个结点--做准备;
  26. p=r; //p地址应该是插入结点的前一个结点的地址,将地址r给地址p,为下一次插入--做准备;
  27. printf("%d ",t); //输出原始数据;
  28. }
  29. if(n==0) //判断链表为空的情况;
  30. {
  31. printf("list is empty\n");
  32. continue;
  33. }
  34. if(q) //在原始数据之后打上换行,放在这里时因为链表为空时不需要打换行;
  35. printf("\n");
  36. p=head.next; //p的重新利用,指向首个结点;
  37. while(p->next!=&rear) //对数据进行操作的循环,判断链表的遍历是否结束,由于此处p-val要与p->next->val比较,所以就判断下一个是不是为尾结点;
  38. {
  39. while(p->val==p->next->val)
  40. p->next=p->next->next;
  41. if(p->next!=&rear)
  42. p=p->next;
  43. }
  44. p=head.next;
  45. b=0;
  46. while(p!=&rear) //打出新数据的循环,判断链表的遍历是否结束,尾结点不进入循环;
  47. {
  48. printf("%d ",p->val);
  49. p=p->next;
  50. }
  51. printf("\n");
  52. }
  53. return 0;
  54. }

[1] 我的个人主页,欢迎访问!
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注