【发布时间】:2021-02-10 17:06:25
【问题描述】:
今天我试图制作一个程序,可以将 15 个随机值(从 100 到 120)输入到链表中。 那部分就像一个魅力。然后我从该列表中找到最大值和最小值,然后找到平均值。
我想将所有大于平均值的值移到该列表的末尾,我尝试使用函数 prebaci 来实现。 函数 unos 将所有元素放入列表中,函数 unosK 将所有元素放入列表末尾。程序进入无限循环,我不知道为什么。您能帮我将所有大于平均值 (107) 的值移到列表末尾吗? 我的代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct lista* Pozicija;
struct lista {
int el;
Pozicija next;
};
void unos(Pozicija P, int el);//input front
void ispis(Pozicija P);//print
int mini(Pozicija P);//find min
int maxi(Pozicija P);//find max
void prebaci(Pozicija P,int x);//function for transfering at the end
void unosK(Pozicija P,int x);//input end
int main() {
srand(time(0));
struct lista L;
L.next = NULL;
int min,max, i,j;
int prvi[21], drugi[15];
int avg;
for (i = 0;i < 21;i++) {
prvi[i] = i + 100;
printf("%d ", prvi[i]);
}
for (i = 0;i < 15;i++) {
int temp = prvi[i];
int random = rand() % 15;
prvi[i] = prvi[random];
prvi[random] = temp;
}
printf("\n\n");
for (i = 0;i < 15;i++) {
//printf("%d ",prvi[i]);
unos(&L, prvi[i]);
}
printf("Ispis\n");
ispis(L.next);
printf("\n\n");
min = mini(L.next);
printf("Minqi:%d\n", min);
printf("\n\n");
max = maxi(L.next);
printf("Miaxi:%d\n", max);
printf("\n\n");
avg = (min + max) / 2;
printf("avg:%d\n", avg);
printf("\n\n");
printf("Prebacaj:\n");
prebaci(&L, avg);
ispis(L.next);
}
void unos(Pozicija P, int el) {
Pozicija q;
q = (Pozicija)malloc(sizeof(struct lista));
q->el = el;
q->next = P->next;
P->next = q;
}
void ispis(Pozicija P) {
while (P != NULL) {
printf("%d ", P->el);
P = P->next;
}
}
int mini(Pozicija P) {
int min;
min = INT_MAX;
while (P != NULL) {
if (min > P->el) {
min = P->el;
}
P = P->next;
}
return min;
}
int maxi(Pozicija P) {
int max;
max = INT_MIN;
while (P != NULL) {
if (max< P->el) {
max = P->el;
}
P = P->next;
}
return max;
}
void prebaci(Pozicija P,int x) {
P = P->next;
Pozicija t;
t = P;
while (t != NULL) {
if (t->el > x)
{
unosK(P, t->el);
t = t->next;
}
else if (t->el <= x) {
unos(P, t->el);
t = t->next;
}
}
}
void unosK(Pozicija P,int x) {
Pozicija q=NULL;
q = (Pozicija)malloc(sizeof(struct lista));
q->el = x;
while (P->next != NULL)
P = P->next;
q->next = P->next;
P->next = q;
}
【问题讨论】:
-
如果你在一个链表上进行迭代并且不断地在链表的末尾添加元素,那么无限循环就不可避免了。
-
您正在计算最小值和最大值的平均值,而不是整个列表的平均值。这是故意的吗?
-
@Jack Jones 为什么在循环中使用数字 15 而不是数字 21 for (i = 0;i
-
@Jack Jones 在列表中有一个虚拟节点(第一个节点)是个坏主意。
-
您可以通过将大于平均的元素移动到新列表然后将新列表附加到旧列表的末尾来避免无限循环。
标签: c linked-list