当前位置:   article > 正文

数据结构 顺序表的相关算法操作_a.elem

a.elem

例题一:比较两个顺序表的大小

比较是通过由两个表的首数据一次向后遍历,逐个比较。如遇到A.elem[i] > B.elem[i],则A>B.如遇到A.elem[i] < B.elem[i]则B<A,若A.elem[i] = B.elem[i]则下一个数据继续比较。

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int LIST_INIT_SIZE = 100;
  4. const int LISTINCREMENT = 10;
  5. typedef struct {
  6. char *elem;
  7. int length;
  8. int listsize;
  9. int listincrementsize;
  10. }SqList;
  11. void InitList(SqList &L, int maxsize = LIST_INIT_SIZE, int incresize = LISTINCREMENT)
  12. {
  13. L.elem = new char[maxsize];
  14. L.length = 0;
  15. L.listsize = maxsize;
  16. L.listincrementsize = incresize;
  17. }
  18. int compare(SqList A, SqList B)
  19. {
  20. int j = 0;
  21. while (j < A.length&&j < B.length)
  22. {
  23. if (A.elem[j] < B.elem[j])
  24. return (-1);
  25. else if (A.elem[j] > B.elem[j])
  26. return (1);
  27. else j++;
  28. }
  29. if (A.length = B.length)
  30. return(0);
  31. else if (A.length < B.length)
  32. return (-1);
  33. else
  34. return (1);
  35. }
  36. void main()
  37. {
  38. int i;
  39. SqList A,B;
  40. InitList(A);
  41. InitList(B);
  42. strcpy(A.elem, "abcdefegsgfd"); //对顺序表A进行赋值
  43. A.length = 12;
  44. strcpy(B.elem, "abcdfksdflpsf"); //对顺序表B进行赋值
  45. B.length = 13;
  46. i = compare(A, B);
  47. if (i == 0)
  48. printf("A和B相等。\n");
  49. else if (i < 0)
  50. printf("A小于B。\n");
  51. else
  52. printf("A大于B。\n");
  53. }

定义两个顺序表,先定义顺序表数据结构,再定义顺序表变量,然后为其赋值时,可以循环赋值也可以用 strcpy() 函数直接赋值。对两个表进行比较时首先定义一个变量 j , 当 j 小于两个表的长度时循环,比较各个数据,若不同则返回相应的值,若相同则比较下一个数据。当跳出循环时,继续执行后续程序时,说明两表前面这部分数据相同,然后比较其表长。

总的来说就两步:一是 j 小于两表长度时比较单个数据大小,二是 j 超过某一个表长度时比较表长。

---------------------------------------------------------------------------------------------------------------------------------

例题二:利用尽量少的辅助空间,将顺序表前m个数据和后n个数据整体互换位置

算法一:利用辅助空间c,先将后n个数的第一个数提出放在c上,然后将前个数进行右移,再将c提前。首先定义两个循环变量i,j,然后大循环就是对于后m个数,for(j=0;j<m;j++); 先将A.elem[m+j]赋值给c,然后进入小循环,for(i=m+j ; i>j ; i--); 此处括号里的 i=m+j ;是因为最初 i 指向 c,但是由于后面的右移操作导致前m个数的下标会加一,所以要加上 j . 范围 i>j 的判断是因为小循环要执行m次,所以直接m+j-m得到 i>j. 最后一步是将c赋给前面的数,最初时A.elem[0],后面要加一所以是A.elem[j]; 代码如下:

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int LIST_INIT_SIZE = 100;
  4. const int LISTINCREMENT = 10;
  5. typedef struct {
  6. char *elem;
  7. int length;
  8. int listsize;
  9. int listincrementsize;
  10. }SqList;
  11. void InitList_Sq(SqList &L, int maxsize = LIST_INIT_SIZE, int incresize = LISTINCREMENT)
  12. {
  13. L.elem = new char[maxsize];
  14. L.length = 0;
  15. L.listsize = maxsize;
  16. L.listincrementsize = incresize;
  17. }
  18. void exchange1(SqList &A, int m, int n)
  19. {
  20. int i, j; //定义i,j 用于循环分别表示前m个数据和后n个数据
  21. char c; //辅助空间
  22. for (j = 0; j < n; j++) //对后n个数据循环
  23. {
  24. c = A.elem[m + j]; //将后n个数据的第一个数据拿出来 即A.elem[m+j];
  25. for (i = m + j; i > j; i--) //对前m个数据进行循环右移
  26. A.elem[i] = A.elem[i - 1];
  27. A.elem[j] = c; //再将之前提出的数放在前面的位置
  28. }
  29. }
  30. void main()
  31. {
  32. int i;
  33. SqList A;
  34. InitList_Sq(A);
  35. strcpy(A.elem, "abcdefghijklmn");
  36. A.length = 14;
  37. exchange1(A, 7, 7);
  38. for (i = 0; i < 14; i++)
  39. printf("%c ", A.elem[i]);
  40. }

算法二:构造辅助函数void invert(char R[], int s, int t),功能是实现数组R[s]到R[t]之间数据的逆置。则调用该函数三次,先整体逆置,再将前n个逆置,最后将后m个逆置即可。对于逆置函数,定义辅助空间和循环变量,然后循环,for (i = s; i <= (s + t) / 2; i++) 其中 i 初始值指向R[s], 由于共有s+t个数 所以循环 i<=(s+t)/2 次,互换时 R[t + s - i],是因为此处原本是R[t],但是由于后面循环要减一,所以要减去i,为保证下标不变所以加上s。代码如下:

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int LIST_INIT_SIZE = 100;
  4. const int LISTINCREMENT = 10;
  5. typedef struct {
  6. char *elem;
  7. int length;
  8. int listsize;
  9. int listincrementsize;
  10. }SqList;
  11. void InitList_Sq(SqList &L, int maxsize = LIST_INIT_SIZE, int incresize = LISTINCREMENT)
  12. {
  13. L.elem = new char[maxsize];
  14. L.length = 0;
  15. L.listsize = maxsize;
  16. L.listincrementsize = incresize;
  17. }
  18. void invert(char R[], int s, int t)
  19. {
  20. char c;
  21. int i;
  22. for (i = s; i <= (s + t) / 2; i++)
  23. {
  24. c = R[i];
  25. R[i] = R[t + s - i]; //此处原本是R[t],但是由于后面循环要减一,所以要减去i,为保证下标不变所以加上s
  26. R[t + s - i] = c;
  27. }
  28. }
  29. void exchange2(SqList A, int m, int n)
  30. {
  31. invert(A.elem, 0, m + n - 1);
  32. invert(A.elem, 0, n - 1);
  33. invert(A.elem, n, m + n - 1);
  34. }
  35. void main()
  36. {
  37. int i;
  38. SqList A;
  39. InitList_Sq(A);
  40. strcpy(A.elem, "abcdefghijklmn");
  41. A.length = 14;
  42. exchange2(A, 7, 7);
  43. for (i = 0; i < 14; i++)
  44. printf("%c ", A.elem[i]);
  45. }

-------------------------------------------------------------------------------------------------------------------

例题三:含有相同元素的表B,构造表A,使其只有B中不相同的元素

本题建立一条空的A表用于存储B表中的数据,在函数体中,首先定义两个循环变量 i, j,分别对应表B和表A,再定义辅助空间e存放数据。先将B表中首数据赋值给A.elem[0],然后进入大循环,for (i = 1; i < B.length; i++)在B表中从第二个元素开始进行遍历,将B表中的数据放在e中,然后对 j 清零,进入小循环while (j < A.length&&A.elem[j] != e)开始对A表进行遍历 j++.当跳出循环时判断是 j=A.length还是A.elem[j]==e.然后选择是将e插入到A表的末尾还是直接进入下一次大循环。

  1. #include<stdio.h>
  2. #include<string.h>
  3. const int LIST_INIT_SIZE = 100;
  4. const int LISTINCREMENT = 10;
  5. typedef struct {
  6. char *elem;
  7. int length;
  8. int listsize;
  9. int listincrementsize;
  10. }SqList;
  11. void InitList_Sq(SqList &L, int maxsize = LIST_INIT_SIZE, int incresize = LISTINCREMENT)
  12. {
  13. L.elem = new char[maxsize];
  14. L.length = 0;
  15. L.listsize = maxsize;
  16. L.listincrementsize = incresize;
  17. }
  18. void purge_Sq(SqList &A, SqList &B)
  19. {
  20. int i, j; //i,j 分别对应检索表B和表A
  21. char e;
  22. A.elem[0] = B.elem[0];
  23. A.length = 1;
  24. for (i = 1; i < B.length; i++)
  25. {
  26. e = B.elem[i];
  27. j = 0; //对A表检索时先将J清零
  28. while (j < A.length&&A.elem[j] != e)
  29. j++;
  30. if (j == A.length)
  31. {
  32. A.elem[A.length] = e;
  33. A.length++;
  34. }
  35. }
  36. delete[] B.elem;
  37. B.listsize = 0;
  38. }
  39. void main()
  40. {
  41. int i;
  42. SqList A;
  43. SqList B;
  44. InitList_Sq(B);
  45. InitList_Sq(A);
  46. strcpy(B.elem, "abbbcdeeefggghijjjklmn");
  47. B.length = 22;
  48. printf("处理前B表的数据为:");
  49. for (i = 0; i < B.length; i++)
  50. printf("%c ", B.elem[i]);
  51. printf("\n");
  52. purge_Sq(A, B);
  53. printf("处理后把B表的数据赋给A表,为:");
  54. for (i = 0; i < A.length; i++)
  55. printf("%c ", A.elem[i]);
  56. }

本笔记所依据的教材为严薇敏版的《数据结构及应用算法教程》

所有代码在Visual Studio 2017上均可正常运行

如有错误欢迎指出

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/829295
推荐阅读
相关标签
  

闽ICP备14008679号