鱼C论坛

 找回密码
 立即注册
查看: 1522|回复: 8

[已解决]数据结构求助

[复制链接]
发表于 2023-10-3 14:52:33 | 显示全部楼层
1. 根据输入表的长度n和各个数据元素值建立一个带头结点的单链表,并输出链表中各元素值,观察输入的内容与输出的内容是否一致;

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int elemtype;
  4. typedef struct lnode{
  5.     elemtype date;
  6.     struct lnode *next;
  7. }lnode,*linklist;

  8. void initlist(linklist &l, int n) {
  9.     l = (linklist)malloc(sizeof(lnode));
  10.     l->next = NULL;
  11.     for(int i = 0; i < n; i++) {
  12.         linklist p = (linklist)malloc(sizeof(lnode));
  13.         scanf("%d", &(p->date));
  14.         p->next = l->next;
  15.         l->next = p;
  16.     }
  17. }

  18. void output(linklist l) {
  19.     linklist p = l->next;
  20.     while(p) {
  21.         printf("%d ", p->date);
  22.         p = p->next;
  23.     }
  24.     printf("\n");
  25. }

  26. int main() {
  27.     int n;
  28.     printf("请输入你想建立的长度:\n");
  29.     scanf("%d", &n);
  30.     linklist l;
  31.     initlist(l, n);
  32.     output(l);
  33.     return 0;
  34. }
复制代码


2. 在链表的第i个元素之前插入一个值为x的元素,并输出插入后的链表中各元素值;

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int elemtype;
  4. typedef struct lnode{
  5.     elemtype date;
  6.     struct lnode *next;
  7. }lnode,*linklist;

  8. void initlist(linklist &l, int n) {
  9.     l = (linklist)malloc(sizeof(lnode));
  10.     l->next = NULL;
  11.     for(int i = 0; i < n; i++) {
  12.         linklist p = (linklist)malloc(sizeof(lnode));
  13.         scanf("%d", &(p->date));
  14.         p->next = l->next;
  15.         l->next = p;
  16.     }
  17. }

  18. void output(linklist l) {
  19.     linklist p = l->next;
  20.     while(p) {
  21.         printf("%d ", p->date);
  22.         p = p->next;
  23.     }
  24.     printf("\n");
  25. }

  26. void insert(linklist &l, elemtype x, int i) {
  27.     linklist p = l;
  28.     for(int j = 0; j < i - 1; j++) {
  29.         p = p->next;
  30.     }
  31.     linklist q = (linklist)malloc(sizeof(lnode));
  32.     q->date = x;
  33.     q->next = p->next;
  34.     p->next = q;
  35. }

  36. int main() {
  37.     int n, i, x;
  38.     printf("请输入你想建立的长度:\n");
  39.     scanf("%d", &n);
  40.     linklist l;
  41.     initlist(l, n);
  42.     output(l);
  43.     printf("请输入你想插入的位置和数值:\n");
  44.     scanf("%d %d", &i, &x);
  45.     insert(l, x, i);
  46.     output(l);
  47.     return 0;
  48. }
复制代码


3. 删除链表中第i个元素,并输出被删除的元素值和删除后的链表中各元素值;

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int elemtype;
  4. typedef struct lnode{
  5.     elemtype date;
  6.     struct lnode *next;
  7. }lnode,*linklist;

  8. void initlist(linklist &l, int n) {
  9.     l = (linklist)malloc(sizeof(lnode));
  10.     l->next = NULL;
  11.     for(int i = 0; i < n; i++) {
  12.         linklist p = (linklist)malloc(sizeof(lnode));
  13.         scanf("%d", &(p->date));
  14.         p->next = l->next;
  15.         l->next = p;
  16.     }
  17. }

  18. void output(linklist l) {
  19.     linklist p = l->next;
  20.     while(p) {
  21.         printf("%d ", p->date);
  22.         p = p->next;
  23.     }
  24.     printf("\n");
  25. }

  26. void delete1(linklist &l, int i) {
  27.     linklist p = l, q;
  28.     for(int j = 0; j < i - 1; j++) {
  29.         p = p->next;
  30.     }
  31.     q = p->next;
  32.     p->next = q->next;
  33.     printf("被删除的元素值为:%d\n", q->date);
  34.     free(q);
  35. }

  36. int main() {
  37.     int n, i;
  38.     printf("请输入你想建立的长度:\n");
  39.     scanf("%d", &n);
  40.     linklist l;
  41.     initlist(l, n);
  42.     output(l);
  43.     printf("请输入你想删除的位置:\n");
  44.     scanf("%d", &i);
  45.     delete1(l, i);
  46.     output(l);
  47.     return 0;
  48. }
复制代码


4. 在链表中查找第i个数据元素结点,如果查找成功,则显示“查找成功!”和该元素的值,否则显示“查找失败!”;

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int elemtype;
  4. typedef struct lnode{
  5.     elemtype date;
  6.     struct lnode *next;
  7. }lnode,*linklist;

  8. void initlist(linklist &l, int n) {
  9.     l = (linklist)malloc(sizeof(lnode));
  10.     l->next = NULL;
  11.     for(int i = 0; i < n; i++) {
  12.         linklist p = (linklist)malloc(sizeof(lnode));
  13.         scanf("%d", &(p->date));
  14.         p->next = l->next;
  15.         l->next = p;
  16.     }
  17. }

  18. void output(linklist l) {
  19.     linklist p = l->next;
  20.     while(p) {
  21.         printf("%d ", p->date);
  22.         p = p->next;
  23.     }
  24.     printf("\n");
  25. }

  26. bool search(linklist l, int i, elemtype &e) {
  27.     linklist p = l;
  28.     for(int j = 0; j < i; j++) {
  29.         p = p->next;
  30.         if(p == NULL) {
  31.             return false;
  32.         }
  33.     }
  34.     e = p->date;
  35.     return true;
  36. }

  37. int main() {
  38.     int n, i;
  39.     elemtype e;
  40.     printf("请输入你想建立的长度:\n");
  41.     scanf("%d", &n);
  42.     linklist l;
  43.     initlist(l, n);
  44.     output(l);
  45.     printf("请输入你想查找的位置:\n");
  46.     scanf("%d", &i);
  47.     if(search(l, i, e)) {
  48.         printf("查找成功!该元素的值为:%d\n", e);
  49.     } else {
  50.         printf("查找失败!\n");
  51.     }
  52.     return 0;
  53. }
复制代码


5. 根据输入的n和n个递增的有序数据建立一个带头结点的有序单链表L1,并输出有序链表中各元素值;

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int elemtype;
  4. typedef struct lnode{
  5.     elemtype date;
  6.     struct lnode *next;
  7. }lnode,*linklist;

  8. void initlist(linklist &l, int n) {
  9.     l = (linklist)malloc(sizeof(lnode));
  10.     l->next = NULL;
  11.     for(int i = 0; i < n; i++) {
  12.         linklist p = (linklist)malloc(sizeof(lnode));
  13.         scanf("%d", &(p->date));
  14.         linklist q = l;
  15.         while(q->next && q->next->date < p->date) {
  16.             q = q->next;
  17.         }
  18.         p->next = q->next;
  19.         q->next = p;
  20.     }
  21. }

  22. void output(linklist l) {
  23.     linklist p = l->next;
  24.     while(p) {
  25.         printf("%d ", p->date);
  26.         p = p->next;
  27.     }
  28.     printf("\n");
  29. }

  30. int main() {
  31.     int n;
  32.     printf("请输入你想建立的长度:\n");
  33.     scanf("%d", &n);
  34.     linklist l;
  35.     initlist(l, n);
  36.     output(l);
  37.     return 0;
  38. }
复制代码


6. 根据输入的m和m个递增的有序数据建立一个带头结点的有序单链表L2,并输出有序链表中各元素值;

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int elemtype;
  4. typedef struct lnode{
  5.     elemtype date;
  6.     struct lnode *next;
  7. }lnode,*linklist;

  8. void initlist(linklist &l, int n) {
  9.     l = (linklist)malloc(sizeof(lnode));
  10.     l->next = NULL;
  11.     for(int i = 0; i < n; i++) {
  12.         linklist p = (linklist)malloc(sizeof(lnode));
  13.         scanf("%d", &(p->date));
  14.         linklist q = l;
  15.         while(q->next && q->next->date < p->date) {
  16.             q = q->next;
  17.         }
  18.         p->next = q->next;
  19.         q->next = p;
  20.     }
  21. }

  22. void output(linklist l) {
  23.     linklist p = l->next;
  24.     while(p) {
  25.         printf("%d ", p->date);
  26.         p = p->next;
  27.     }
  28.     printf("\n");
  29. }

  30. int main() {
  31.     int m;
  32.     printf("请输入你想建立的长度:\n");
  33.     scanf("%d", &m);
  34.     linklist l;
  35.     initlist(l, m);
  36.     output(l);
  37.     return 0;
  38. }
复制代码


7. 将有序链表L1和L2合并到单链表L1中,要求使用原链中的结点,并使L1保持其原有序性,最后输出合并后的有序链表中各结点的元素值。

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int elemtype;
  4. typedef struct lnode{
  5.     elemtype date;
  6.     struct lnode *next;
  7. }lnode,*linklist;

  8. void initlist(linklist &l, int n) {
  9.     l = (linklist)malloc(sizeof(lnode));
  10.     l->next = NULL;
  11.     for(int i = 0; i < n; i++) {
  12.         linklist p = (linklist)malloc(sizeof(lnode));
  13.         scanf("%d", &(p->date));
  14.         linklist q = l;
  15.         while(q->next && q->next->date < p->date) {
  16.             q = q->next;
  17.         }
  18.         p->next = q->next;
  19.         q->next = p;
  20.     }
  21. }

  22. void merge(linklist &l1, linklist l2) {
  23.     linklist p1 = l1->next, p2 = l2->next, q = l1;
  24.     while(p1 && p2) {
  25.         if(p1->date <= p2->date) {
  26.             q = p1;
  27.             p1 = p1->next;
  28.         } else {
  29.             q->next = p2;
  30.             p2 = p2->next;
  31.             q = q->next;
  32.             q->next = p1;
  33.         }
  34.     }
  35.     if(p2) {
  36.         q->next = p2;
  37.     }
  38.     free(l2);
  39. }

  40. void output(linklist l) {
  41.     linklist p = l->next;
  42.     while(p) {
  43.         printf("%d ", p->date);
  44.         p = p->next;
  45.     }
  46.     printf("\n");
  47. }

  48. int main() {
  49.     int n, m;
  50.     printf("请输入L1的长度:\n");
  51.     scanf("%d", &n);
  52.     linklist l1;
  53.     initlist(l1, n);
  54.     printf("请输入L2的长度:\n");
  55.     scanf("%d", &m);
  56.     linklist l2;
  57.     initlist(l2, m);
  58.     merge(l1, l2);
  59.     output(l1);
  60.     return 0;
  61. }
复制代码


8. 已知两个一元多项式A(x)=a1xe1+ a2xe2+……+ amxem,B(x)= b1xe1+ b2xe2+……+ bmxen,其中ei为整数指数且递增有序。要求编写算法实现两个一元多项式A和B的加法运算A(x)= A(x)+ B(x),并编写程序测试其正确性。

```c++
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int coef;
    int expn;
    struct node *next;
}node, *linklist;

void initlist(linklist &l, int n) {
    l = (linklist)malloc(sizeof(node));
    l->next = NULL;
    for(int i = 0; i < n; i++) {
        linklist p = (linklist)malloc(sizeof(node));
        scanf("%d %d", &(p->coef), &(p->expn));
        linklist q = l;
        while(q->next && q->next->expn > p->expn) {
            q = q->next;
        }
        if(q->next && q->next->expn == p->expn) {
            q->next->coef += p->coef;
            free(p);
        } else {
            p->next = q->next;
            q->next = p;
        }
    }
}

void output(linklist l) {
    linklist p = l->next;
    while(p) {
        printf("%dx^%d", p->coef, p->expn);
        if(p->next) {
            printf("+");
        }
        p = p->next;
    }
    printf("\n");
}

void add(linklist &A, linklist B) {
    linklist p = A->next, q = B->next, r = A;
    while(p && q) {
        if(p->expn < q->expn) {
            r->next = p;
            r = p;
            p = p->next;
        } else if(p->expn == q->expn) {
            p
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-26 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表