• 线性表章节课后习题答案集锦


    目录

    2.5

    2.6

    2.7

    2.8

    2.9

    2.10

    2.11

    2.12

    2.13

    2.5

    1. /*
    2. 要比较两个单词在字典中的顺序,可以逐个比较它们的字符。首先比较两个单词的第一个字符,如果相同,则继续比较下一个字符,直到找到不同的字符或者某个单词比较完毕。比较时,可以利用ASCII码进行比较,因为字母在ASCII码中是按顺序排列的。
    3. */
    4. #include<stdio.h>
    5. #include<string.h>
    6. int compareWords(char* word1, char* word2) {
    7. int len1 = strlen(word1);
    8. int len2 = strlen(word2);
    9. int minLen = len1 < len2 ? len1 : len2;//三目运算符,如果?前面的式子成立,返回:前面的值,否则返回后面的
    10. int i;
    11. for (i = 0; i < minLen; i++) {
    12. if (word1[i] < word2[i]) {
    13. return -1; // word1在字典中排在前面
    14. } else if (word1[i] > word2[i]) {
    15. return 1; // word2在字典中排在前面
    16. }
    17. }
    18. // 如果前面的字符都相同,则长度较短的单词在字典中排在前面
    19. if (len1 < len2) {
    20. return -1;
    21. } else if (len1 > len2) {
    22. return 1;
    23. }
    24. // 两个单词相等
    25. return 0;
    26. }
    27. int main() {
    28. char word1[] = "apple";
    29. char word2[] = "banana";
    30. int result = compareWords(word1, word2);
    31. if (result < 0) {
    32. printf("%s 在字典中排在 %s 前面\n", word1, word2);
    33. } else if (result > 0) {
    34. printf("%s 在字典中排在 %s 前面\n", word2, word1);
    35. } else {
    36. printf("%s 和 %s 相等\n", word1, word2);
    37. }
    38. return 0;
    39. }

    2.6

    1. /*
    2. 定义两个指针,分别指向顺序表的头部和尾部。
    3. 依次交换头部和尾部指针指向的元素,直到两个指针相遇或者交叉。
    4. 当两个指针相遇或者交叉时,表就地逆置完成。
    5. */
    6. #include<stdio.h>
    7. #define MaxSize 50
    8. typedef int ElemType;
    9. typedef struct
    10. {
    11. ElemType data[MaxSize]; // 存放顺序表元素
    12. int length; // 存放顺序表的长度
    13. } SqList; // 顺序表的类型
    14. void InitList(SqList *L)
    15. {
    16. L->length = 0;
    17. }
    18. void CreateList(SqList *L, ElemType a[], int n)
    19. {
    20. int i;
    21. for (i = 0; i < n; i++)
    22. {
    23. L->data[i] = a[i];
    24. }
    25. L->length = n;
    26. }
    27. void ReverseList(SqList *L)
    28. {
    29. int i, temp;
    30. for (i = 0; i < L->length / 2; i++)
    31. {
    32. // 交换位置i和length-i-1的元素
    33. temp = L->data[i];
    34. L->data[i] = L->data[L->length - i - 1];
    35. L->data[L->length - i - 1] = temp;
    36. }
    37. }
    38. void DisplayList(SqList *L)
    39. {
    40. int i;
    41. for (i = 0; i < L->length; i++)
    42. {
    43. printf("%d ", L->data[i]);
    44. }
    45. printf("\n");
    46. }
    47. int main()
    48. {
    49. SqList L;
    50. ElemType a[] = {1, 2, 3, 4, 5};
    51. CreateList(&L, a, 5); // 创建顺序表
    52. printf("原顺序表元素:");
    53. DisplayList(&L);
    54. ReverseList(&L); // 就地逆置顺序表
    55. printf("逆置后顺序表元素:");
    56. DisplayList(&L);
    57. return 0;
    58. }

    2.7

    1. /*根据m和n的大小选择将谁接在谁的后面,设置指针分别指向两个链表开头,从端链表的开头开始向后移动,直到移动到最后,然后末尾接在下一个链表的第一个节点,两个链表连接在一起*/
    2. #include<stdio.h>
    3. #include<stdlib.h>
    4. typedef struct Node {
    5. int value;
    6. struct Node* next;
    7. } LinkList;
    8. LinkList* connect(LinkList* ha, LinkList* hb, int m, int n) {
    9. LinkList* hc, *rear;
    10. if (m >= n) {
    11. hc = hb;
    12. rear = ha;
    13. }
    14. else {
    15. hc = ha;
    16. rear = hb;
    17. }
    18. LinkList* head = hc;
    19. while (hc->next != NULL) {
    20. hc = hc->next;
    21. }
    22. hc->next = rear->next;
    23. ha = hb = NULL;
    24. return head;
    25. }
    26. LinkList* createList(int arr[], int n) {
    27. LinkList* rear;
    28. LinkList* l = (LinkList*)malloc(sizeof(LinkList));
    29. rear = l;
    30. int i;
    31. for (i = 0; i < n; i++) {
    32. LinkList* tmp = (LinkList*)malloc(sizeof(LinkList));
    33. tmp->value = arr[i];
    34. rear->next = tmp;
    35. rear = rear->next;
    36. }
    37. rear->next = NULL;
    38. return l;
    39. }
    40. int main() {
    41. int a[] = { 1,5,6,2,1,7 };
    42. int b[] = { 7,3,12,2,9,8,11 };
    43. LinkList* l1 = createList(a, sizeof(a) / sizeof(a[0]));
    44. LinkList* l2 = createList(b, sizeof(b) / sizeof(b[0]));
    45. LinkList* l = connect(l1, l2, sizeof(a) / sizeof(a[0]), sizeof(b) / sizeof(b[0]));
    46. l = l->next;
    47. while (l != NULL) {
    48. printf("%d ", l->value);
    49. l = l->next;
    50. }
    51. return 0;
    52. }

    2.8

    1. /*定义指针分别指向两个链表的开头,以及开头的下一个元素,然后使用一个指针在两个链表之间交叉移动,将两个链表串起来*/
    2. #include<stdio.h>
    3. #include<stdlib.h>
    4. #define error -1;
    5. #define OK 1;
    6. typedef int ElemType;//typedef表示重命名
    7. typedef int status;
    8. typedef struct LNode
    9. {
    10. ElemType data;
    11. struct LNode *next;
    12. }LNode, *LinkList;
    13. LinkList creat()
    14. {//使用尾插法建立带头结点的单链表;
    15. LinkList L;
    16. L = (LinkList)malloc(sizeof(LNode)); //开辟头结点空间
    17. if(!L){
    18. printf("memory malloc error!\n");
    19. }
    20. LinkList p = L;
    21. ElemType a;
    22. int len;
    23. printf("请输入待建表的表长:");
    24. scanf("%d", &len);
    25. if(len>0)
    26. {
    27. int i;
    28. for(i=0; i<len; i++)
    29. {
    30. printf("请输入第%d个元素的值:", i+1);
    31. scanf("%d", &a);
    32. p->next = (LinkList)malloc(sizeof(LNode));
    33. p->next->data = a;
    34. p = p->next;
    35. }
    36. }
    37. p->next = NULL;
    38. return L;
    39. }
    40. void print(LinkList L)
    41. {
    42. LinkList p = L ->next;
    43. while(p != NULL)
    44. {
    45. printf("%d\n", p->data);
    46. p = p->next;
    47. }
    48. }
    49. LinkList mix_connect(LinkList A, LinkList B)
    50. {//A,B均为带头结点的单链表,长度均未显式存储
    51. if(A->next == NULL && B->next == NULL)
    52. return NULL;
    53. else
    54. {
    55. LinkList p = A->next;
    56. LinkList q = B->next;
    57. LinkList C = A; C->next = NULL;
    58. LinkList s = C;
    59. free(B);
    60. while(p != NULL && q != NULL)
    61. {
    62. s->next = p;
    63. p = p->next;
    64. s = s->next;
    65. s->next = q;
    66. q = q->next;
    67. s = s->next;
    68. }
    69. if(p != NULL)
    70. s->next = p;
    71. if(q != NULL)
    72. s->next = q; //这两个if只会执行其中一个
    73. return C;
    74. }
    75. }
    76. int main()
    77. {
    78. LinkList A = creat();
    79. LinkList B = creat();
    80. LinkList C=mix_connect(A, B);
    81. print(C);
    82. return 0;
    83. }

    2.9

    1. /*
    2. 创建三个循环链表,分别用于存放字母字符、数字字符和其它键盘字符。
    3. 遍历原链表,将不同类别的字符按照类别链接到对应的循环链表中。
    4. 遍历完成后,将每个循环链表的尾节点的 next 指针指向头节点,形成循环链表。
    5. */
    6. #include<stdio.h>
    7. #include<stdlib.h>
    8. typedef struct Node {
    9. char data;
    10. struct Node* next;
    11. } Node, *LinkList;
    12. void splitList(LinkList L, LinkList* alphabetList, LinkList* digitList, LinkList* otherList) {//遍历原链表,将不同类别的字符按照类别链接到对应的循环链表中。
    13. Node *p = L->next, *q, *r, *s, *t, *u;
    14. *alphabetList = (LinkList)malloc(sizeof(Node));
    15. *digitList = (LinkList)malloc(sizeof(Node));
    16. *otherList = (LinkList)malloc(sizeof(Node));
    17. (*alphabetList)->next = (*digitList)->next = (*otherList)->next = NULL;
    18. q = *alphabetList;
    19. r = *digitList;
    20. s = *otherList;
    21. while (p != NULL) {
    22. if ((p->data >= 'a' && p->data <= 'z') || (p->data >= 'A' && p->data <= 'Z')) {
    23. q->next = p;
    24. q = p;
    25. } else if (p->data >= '0' && p->data <= '9') {
    26. r->next = p;
    27. r = p;
    28. } else {
    29. s->next = p;
    30. s = p;
    31. }
    32. p = p->next;
    33. }
    34. q->next = (*alphabetList)->next;
    35. r->next = (*digitList)->next;
    36. s->next = (*otherList)->next;
    37. // 移除哑结点,并连接头指针到第一个有效节点上
    38. *alphabetList = (*alphabetList)->next;
    39. *digitList = (*digitList)->next;
    40. *otherList = (*otherList)->next;
    41. // 将最后一个节点的next指针置为NULL,避免环形链表
    42. q->next = NULL;
    43. r->next = NULL;
    44. s->next = NULL;
    45. }
    46. void printList(LinkList L) {
    47. Node* p = L;
    48. while (p != NULL) {
    49. printf("%c ", p->data);
    50. p = p->next;
    51. }
    52. printf("\n");
    53. }
    54. int main() {
    55. char chars[] = "a1b2c3!@#d4";
    56. LinkList L = (LinkList)malloc(sizeof(Node));
    57. Node* p = L;
    58. int i;
    59. for (i = 0; i < sizeof(chars) / sizeof(chars[0]); i++) {
    60. Node* newNode = (Node*)malloc(sizeof(Node));
    61. newNode->data = chars[i];
    62. newNode->next = NULL;
    63. p->next = newNode;
    64. p = newNode;
    65. }
    66. LinkList alphabetList, digitList, otherList;//分别表示字母,数字和其它
    67. splitList(L, &alphabetList, &digitList, &otherList);
    68. printf("Alphabet List: ");
    69. printList(alphabetList);
    70. printf("Digit List: ");
    71. printList(digitList);
    72. printf("Other List: ");
    73. printList(otherList);
    74. return 0;
    75. }

    2.10

    1. #include<stdio.h>
    2. typedef int ElemType;
    3. typedef struct DuLNode{
    4. ElemType data;
    5. struct DuLNode *prior;
    6. struct DuLNode *next;
    7. } DuLNode, *DuLinkList;
    8. //初始化双向循环链表(头节点)
    9. DuLinkList InitDuLinkList()
    10. {
    11. DuLNode *dnode = (DuLNode *)malloc(sizeof(DuLNode));
    12. dnode->data = 0;
    13. dnode->prior = dnode;
    14. dnode->next = dnode;
    15. return dnode;
    16. }
    17. //创建链表元素
    18. void CreateDuLinkList(DuLinkList L, ElemType *arr, int n)
    19. {
    20. DuLNode *dnode;
    21. DuLNode *p = L;
    22. int i;
    23. for (i = 0; i < n; i++)
    24. {
    25. dnode = (DuLNode *)malloc(sizeof(DuLNode));
    26. dnode->data = arr[i];
    27. dnode->next = L;
    28. dnode->prior = p;
    29. p->next = dnode;
    30. p = p->next;
    31. }
    32. }
    33. //输出链表
    34. void ShowList(DuLinkList L)
    35. {
    36. int i;
    37. DuLNode *r = L->next;
    38. while (r->next != L){
    39. printf("%d ", r->data);
    40. r = r->next;
    41. }
    42. printf("%d ", r->data);
    43. printf("\n");
    44. }
    45. /*
    46. 将L中的元素,按如下规则插入新表,并返回新表。
    47. 1,2)->(1,3,2)->(1,3,4,2)->(1,3,5,4,2)->(1,3,5,6,4,2)->...
    48. */
    49. DuLinkList Transform(DuLinkList L)
    50. {
    51. DuLinkList Lnew = InitDuLinkList();
    52. DuLNode *p, *q, *pa, *pb;
    53. q = p = L->next;
    54. pa = pb = Lnew;
    55. while (p != L)
    56. {
    57. if (p != L)
    58. {
    59. /*L中寄数个数据插入Lnew*/
    60. q = p->next;//保留 L 链表
    61. //pa之后插入p
    62. p->prior = pa;
    63. pa->next = p;
    64. p->next = pb;
    65. pb->prior = p;
    66. pa = pa->next;
    67. p = q;//p指向 待操作 L
    68. }
    69. if (p != L)
    70. {
    71. /*L中偶数个数据插入Lnew*/
    72. q = p->next;//保留 L 链表
    73. //pb之前插入p
    74. p->next = pb;
    75. pb->prior = p;
    76. p->prior = pa;
    77. pa->next = p;
    78. pb = pb->prior;
    79. p = q;//p指向 待操作 L
    80. }
    81. }
    82. return Lnew;
    83. }
    84. int main()
    85. {
    86. ElemType data[7] = { 1, 2, 3, 4, 5, 6, 7 };//测试数据1(奇数个)
    87. //ElemType data[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };//测试数据2(偶数个)
    88. int length = sizeof(data) / sizeof(ElemType);
    89. DuLinkList L = InitDuLinkList(), Lnew;
    90. CreateDuLinkList(L, data, length);
    91. printf("原链表:");
    92. ShowList(L);
    93. Lnew = Transform(L);
    94. printf("改造表:");
    95. ShowList(Lnew);
    96. getchar();
    97. return 0;
    98. }

    2.11

    1. /*从最小的位置开始,将后面的数据依次往前赋值,然后指针向后移动*/
    2. #include<stdio.h>
    3. #include<string.h>
    4. #include<stdlib.h>
    5. typedef struct node
    6. {
    7. int data;//数据
    8. int length;//长度
    9. struct node *next;
    10. }Node,*LinkList;
    11. //删除超过范围的内容
    12. void deLinkList(LinkList L,int mink,int maxk)
    13. {
    14. LinkList p,q;p=L;
    15. while(p!=NULL)
    16. {
    17. if(p->data>mink&&p->data<maxk)
    18. {
    19. printf("找到错误目标\n");
    20. q=p->next;
    21. p->data=q->data;
    22. p->next=q->next;
    23. free(q);
    24. }
    25. else p=p->next;
    26. }
    27. }
    28. //得到要输入的数据数量
    29. int getnumber()
    30. {
    31. int n;
    32. printf("请输入你要录入的数据数量:");
    33. scanf("%d",&n);
    34. return n;
    35. }
    36. /*建立链表
    37. 后插入法创造链表
    38. 算法时间复杂度为O(n)
    39. */
    40. LinkList init(int n)
    41. {
    42. int i;
    43. LinkList L;
    44. Node *r;
    45. Node *p;
    46. L=(LinkList)malloc(sizeof(Node));//建立一个带头指针的空链表
    47. L->next=NULL;
    48. r=L;//尾指针r指向头结点
    49. for(i=1;i<=n;i++)
    50. {
    51. p=(Node *)malloc(sizeof(Node));//生成新结点
    52. printf("输入第%d位的数据:",i);//输入元素值赋给新结点*p的数据域
    53. scanf("%d",&p->data);
    54. p->next=NULL;//将新结点*p插入尾结点*r之后
    55. r->next=p;//r指向新的尾结点*p
    56. r=p;
    57. }
    58. L->length=n;
    59. return L;
    60. }
    61. //展示信息
    62. //算法的时间复杂度未O(n),n为单链表中的数据节点的个数
    63. void show(LinkList L)
    64. {
    65. int i=0;
    66. Node *p;
    67. p=L->next;
    68. while(p)
    69. {
    70. i++;
    71. printf("第%d位的数据:%d\n",i,p->data);
    72. p=p->next;
    73. }
    74. printf("\n信息已全部输出\n");
    75. }
    76. //主函数
    77. int main()
    78. {
    79. int n,mink,maxk;
    80. LinkList L;
    81. n=getnumber();
    82. L=init(n);
    83. show(L);
    84. //删除mink~maxk之间的元素
    85. printf("请输入mink、maxk的值\n");
    86. scanf("%d%d",&mink,&maxk);
    87. deLinkList(L,mink,maxk);
    88. show(L);
    89. free(L);
    90. }

    2.12

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. typedef struct LNode
    4. {
    5. int data;
    6. struct LNode *next;
    7. }LNode, *LinkList;
    8. int InitList(LinkList *L)
    9. {
    10. *L = (LinkList)malloc(sizeof(LNode));
    11. (*L)->next = NULL;
    12. return 0;
    13. }
    14. int CreateList(LinkList *L, int e)
    15. {
    16. LinkList p = *L;
    17. while(p->next)
    18. p = p->next;
    19. LinkList temp = (LinkList)malloc(sizeof(LNode));
    20. temp->data = e;
    21. temp->next = NULL;
    22. p->next = temp;
    23. return 0;
    24. }
    25. int DispList(LinkList *L)
    26. {
    27. LinkList p = (*L)->next;
    28. while(p)
    29. {
    30. printf("%d\t", p->data);
    31. p = p->next;
    32. }
    33. return 0;
    34. }
    35. int ListOppose(LinkList *L)
    36. {
    37. LinkList q, p, s;
    38. p = *L;
    39. p = p->next;
    40. (*L)->next = NULL;
    41. while(p)
    42. {
    43. q = p;
    44. p = p->next;
    45. q->next = (*L)->next;
    46. (*L)->next = q;
    47. }
    48. return 0;
    49. }
    50. int ListMerge(LinkList *A, LinkList *B, LinkList *C)
    51. {
    52. LinkList qa, pa, pb, qb;
    53. pa = *A; qa = pa; pa = pa->next;
    54. pb = (*B)->next;
    55. *C = *A;
    56. while(pa && pb)
    57. {
    58. if(pa->data <= pb->data)
    59. {
    60. qb = pb;
    61. pb = pb->next;
    62. qb->next = qa->next;
    63. qa->next = qb;
    64. qa = qa->next;
    65. }
    66. else
    67. {
    68. qb = pb;
    69. pb = pb->next;
    70. qb->next = pa->next;
    71. pa->next = qb;
    72. pa = pa->next;
    73. }
    74. }
    75. free(*B);
    76. return 0;
    77. }
    78. int main()
    79. {
    80. LinkList A, B, C;
    81. InitList(&A);
    82. InitList(&B);
    83. int i;
    84. for(i = 1; i< 6; i++)
    85. CreateList(&A, i);
    86. int j;
    87. for(j = 4; j < 11; j++)
    88. CreateList(&B, j);
    89. printf("\nA 链表为:\n");
    90. DispList(&A);
    91. printf("\nB 链表为:\n");
    92. DispList(&B);
    93. printf("\nC 链表为:\n");
    94. ListOppose(&A);
    95. ListOppose(&B);
    96. printf("\n逆置后的 A 链表为:\n");
    97. DispList(&A);
    98. printf("\n逆置后的 B 链表为:\n");
    99. DispList(&B);
    100. ListMerge(&A, &B, &C);
    101. printf("\n合并后的 C 链表为:\n");
    102. DispList(&C);
    103. return 0;
    104. }

    2.13

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. typedef struct {
    4. int* data; // 存放元素的数组
    5. int length; // 当前长度
    6. int maxSize; // 最大长度
    7. } SqList;
    8. // 初始化顺序表
    9. void initList(SqList* list, int maxSize) {
    10. list->data = (int*)malloc(maxSize * sizeof(int));
    11. list->length = 0;
    12. list->maxSize = maxSize;
    13. }
    14. // 在顺序表中查找元素的位置,返回位置下标
    15. int locateElem(SqList* list, int elem) {
    16. int i;
    17. for (i = 0; i < list->length; i++) {
    18. if (list->data[i] == elem) {
    19. return i;
    20. }
    21. }
    22. return -1; // 找不到返回-1
    23. }
    24. // 添加元素到顺序表的末尾
    25. void addElem(SqList* list, int elem) {
    26. if (list->length < list->maxSize) {
    27. list->data[list->length++] = elem;
    28. }
    29. }
    30. // 求A和B的交集,结果保存在C中
    31. void intersection(SqList* A, SqList* B, SqList* C) {
    32. int i = 0, j = 0;
    33. while (i < A->length && j < B->length) {
    34. if (A->data[i] == B->data[j]) {
    35. addElem(C, A->data[i]);
    36. i++;
    37. j++;
    38. } else if (A->data[i] < B->data[j]) {
    39. i++;
    40. } else {
    41. j++;
    42. }
    43. }
    44. }
    45. // 打印顺序表的元素
    46. void printList(SqList* list) {
    47. int i;
    48. for (i = 0; i < list->length; i++) {
    49. printf("%d ", list->data[i]);
    50. }
    51. printf("\n");
    52. }
    53. int main() {
    54. SqList A, B, C;
    55. int maxSize = 10; // 假设最大长度为10
    56. initList(&A, maxSize);
    57. initList(&B, maxSize);
    58. initList(&C, maxSize);
    59. // 假设A和B的元素是有序且不重复的
    60. int a[] = {1, 3, 5, 7, 9};
    61. int b[] = {3, 4, 5, 6, 7};
    62. int i;
    63. for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) {
    64. addElem(&A, a[i]);
    65. }
    66. int j;
    67. for (j = 0; j < sizeof(b) / sizeof(b[0]); j++) {
    68. addElem(&B, b[j]);
    69. }
    70. printf("集合A:");
    71. printList(&A);
    72. printf("集合B:");
    73. printList(&B);
    74. intersection(&A, &B, &C);
    75. printf("集合C(A和B的交集):");
    76. printList(&C);
    77. free(A.data);
    78. free(B.data);
    79. free(C.data);
    80. return 0;
    81. }
  • 相关阅读:
    【C++】C++面向对象编程三大特性之一——继承
    Java枚举类 (详细解析java中的枚举类深入浅出)
    自大型人格分析,如何改变自大型性格?
    杰理强制升级工具4.0使用和原理解析
    Star CCM+相关资料分享
    JavaEE 多线程下的HashTable、HashMap、ConcurrentHashMap
    价值1000元的稀有二开版的无限坐席在线客服系统源码+教程
    使用扩展有效对齐 SwiftUI 内容,创建自定义 SwiftUI 方法以快速对齐项目并使您的代码看起来简洁明了(教程含源码)
    微信小程序 js中写一个px单位转rpx单位的函数
    实例删除后volume仍然为in-use解决方法
  • 原文地址:https://blog.csdn.net/m0_72674633/article/details/136759141