【发布时间】:2022-12-01 04:16:40
【问题描述】:
下面的程序从命令行读取一个非负整数数组。我的目标是使用双向链表删除所有偶数整数,并仅逐行输出奇数整数,最后输出奇数整数之和。
`
#include <stdio.h>
#include <stdlib.h>
typedef struct Node { // Defining a double linked list through struct. Node -> | llink | data | rlink |
int data;
struct Node *rlink;
struct Node *llink;
} Node;
// Declaring function prototypes.
Node *nodeAdder (char *argv[], int len);
int evenCounter (char *argv[], int len);
Node *evenRemover (Node *initial);
void llSum (int *sum, Node *initial);
void oddPrint (Node *initial);
Node *nodeAdder (char *argv[], int len)
Node *initial, *llink, *current;
initial = (Node*)calloc(1, sizeof(Node));
current = initial;
current->data = atoi(argv[1]);
int i;
for(i=0; i < len-1; i++) {
current->rlink = (Node*)calloc(1, sizeof(Node));
llink = current;
current = current->rlink;
current->data = atoi(argv[i+2]);
current->llink = llink;
}
current->rlink = NULL;
return initial;
}
int evenCounter (char *argv[], int len) {
int i, count=0;
for(i=0; i < len; i++) {
if(atoi(argv[i+1]) % 2 == 0) {
count = count + 1;
}
}
return count;
}
Node *evenRemover (Node *initial) {
Node *leftLink=NULL, *rightLink=NULL, *remove=initial;
while(remove->data % 2 != 0 && remove->rlink != NULL) {
remove = remove->rlink;
}
if(remove->llink == NULL) {
initial = remove->llink;
initial->llink = NULL;
}
else if(remove->rlink == NULL) {
leftLink = remove->llink;
leftLink->rlink = NULL;
}
else {
leftLink = remove->llink;
rightLink = remove->rlink;
leftLink->rlink = rightLink;
rightLink->llink = leftLink;
}
free(remove);
return initial;
}
void llSum (int *sum, Node *initial) {
Node *ptr=initial;
while(ptr != NULL) {
*sum = *sum + ptr->data;
ptr = ptr->rlink;
}
}
void oddPrint (Node *initial) {
Node *ptr = NULL;
for(ptr=initial; ptr != NULL; ptr = ptr->rlink) {
printf("%i\n", ptr->data);
}
}
int main (int argc, char *argv[]) {
Node *initial = NULL;
int total=0, len=argc-1, i=0;
int evens = evenCounter(argv, len);
initial = nodeAdder(argv, len);
for(i; i < evens; i++) {
initial = evenRemover(initial);
}
llSum(&total, initial);
oddPrint(initial);
printf("%i\n", total);
return 0;
}
`
示例输入:10 15 20 25 30
示例输出:
15
25
40
如果输入中的整数以奇数开头,则一切正常,但是当它以偶数开头时,它不会打印任何内容。
我想知道是否有人可以帮助我找到我的错误?
我花了一段时间才想出我现在拥有的东西,而且我看不出这种方法有什么问题。我肯定某处只是一个小错误
【问题讨论】:
-
欢迎!您的代码无法编译,原因之一是不平衡
{大括号}。请发一个Minimal Reproducible Example,最短完全的显示问题的代码。最好的方法是复制/粘贴。我可以建议您使用Tour 并阅读How do I ask a good question?
标签: c data-structures linked-list dynamic-memory-allocation