c - 打印链表中的值对

标签 c algorithm linked-list

这是我创建链表的代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct list_element {
    int inf;
    struct list_element *next;
} List;

List *create() {
    List *p, *punt;
    int x = 1;/*Random number but different from 0*/
    p = (List *)malloc(sizeof(List));
    printf("\nFirst value: ");
    scanf("%d", &p->inf);
    punt = p;

    while (1) {/*Till x different from 0*/
        printf("\nNext value: ");
        scanf("%d", &x);
        if (x == 0)
            break;
        punt->next = (List *)malloc(sizeof(List));
        punt = punt->next;
        punt->inf = x;
    }
    punt->next = NULL;
    return p;
}

int main(void) {
    List *a;
    a = create();
}

假设在 input(scanf) 中发送以下值:

10 20 30 40 50 15 35

我需要创建一个 void 函数,它将总和为 50 的数字对列表发送到 stdout,因此在这种情况下,输出将是

10 40

20 30

15 35

为此我使用了两个不同的函数:
在第一个函数中,我将链表的值复制到一个 int 数组中,在第二个函数中,使用回溯算法(在刚刚创建的数组上执行)我找到了解决方案。
这是我的解决方案:

void BackTrack(int n, int s, int x[7], int z[7], int partial, int max, int check) {
    if (n == s) {
        int y = 0;
        for (int i = 0; i < n; i++){
            if (z[i] != 0 && check == 2 && partial == max) {
                printf("%d ", z[i]);
                y++;
            }
        }
        if(y != 0)
            printf("\n");
        return;
    }

    z[s] = 0;
    BackTrack(n, s + 1, x, z, partial, max, check);

    if (x[s] + partial <= max) {
        z[s] = x[s];
        partial += x[s];
        check++;
        BackTrack(n, s + 1, x, z, partial, max, check);
    }
}

void ARRAY(List *p) {
    int *x = NULL;
    int i;
    for (i = 0; p != NULL; i++){
        x = realloc(x, sizeof(int) * (i + 1));
        x[i] = p->inf;
        p = p->next;
    }
    int *z = malloc(sizeof(int) * i);
    BackTrack(i, 0, x, z, 0, 50, 0);
}

但我想知道是否有一种方法可以像我一样在数组对话之前不使用 before 来做到这一点?所以直接找到链表上的情侣。谢谢

最佳答案

void FindPairs(List *list, int sum) {

  struct list_element *i, *j;

  for (i = list; i; i = i->next) {
    if (i->inf > sum)
      continue;
    for (j = i->next; j; j = j->next) {
      if (i->inf + j->inf == sum)
        printf("%d %d\n", i->inf, j->inf);
    }
  }
}

关于c - 打印链表中的值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39789883/

相关文章:

algorithm - 如何计算 "15% of the time"随机数?

c - 删除链表元素

c - 在linux c中使用深度优先搜索遍历目录

c - 映射区域的错误权限

c - 音频数据包类型

objective-c - 内联函数 "undefined symbols"错误

arrays - 如何从两个数组中选取元素以使总和之间的差异最小

java - 给定 40 亿个未排序的整数,寻找缺失的整数

c - 中断导致运行时错误

c++ - 遍历所有链表的高效算法(C++)