这是我创建链表的代码:
#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/