使用嵌套while循环

时间:2016-11-22 06:35:44

标签: c

我需要一些帮助。

我星期三有这个家庭作业,我唯一无法做的就是扭转我的链表。我整天都在努力工作。

我的教授没有告诉我们任何方式这样做,也不允许我们给他发电子邮件,所以我有点卡住了。

他希望我们通过使用嵌套的while循环和名为front&的指针来实现这一目标。回来了,还有新人。

以下是我的代码。如果您有任何问题,请提前告知我们。

注意:使用GNU编译器在Code :: Blocks中编译代码。

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

typedef struct node {
    int random_number;
    struct node *next;
} Node;

typedef Node *Nodeptr;

void printout(Nodeptr);
void sum(Nodeptr);
void reverse(Nodeptr);

int main() {
    Nodeptr head = NULL;

    if ((head = malloc(sizeof(Node))) == NULL)
        return 0;
    head->random_number = rand() % 50 + 50;
    head->next = NULL;

    Nodeptr here = head;
    Nodeptr newnode = NULL;
    int n;

    for (n = 0; n < 10; n++) {
        if ((newnode = malloc(sizeof(Node))) == NULL)
            return 0;
        newnode->random_number = rand() % 50 + 50;
        newnode->next = NULL;
        here->next = newnode;
        here = here->next;
    }
    printout(head);
    sum(head);
    reverse(&head);
    printout(head);

    return 0;
}

void printout(Nodeptr head) {
    Nodeptr aux = head;
    int n = 0;
    while (aux != NULL) {
        printf("The value of node no. %d is %d \n", n, aux->random_number);
        aux = aux->next;
        n++;
    }
}

void sum(Nodeptr head) {
    Nodeptr aux = head;
    int n = 0, sum = 0;
    while (aux != NULL) {
        sum += aux->random_number;
        aux = aux->next;
        n++;
    }
    printf("The sum total of all nodes in this list is %d\n", sum);
}

void reverse(Nodeptr head) {
    Nodeptr newhead = head;
    Nodeptr back = NULL;
    Nodeptr front = NULL;

    while (back != NULL) {
        front->next = back;
        back = NULL;
        front = head->next;
        back = head;
        while (front != NULL) {
            front = newhead->next;
            newhead->next = back;
            back = newhead;
        }
        newhead = head;
    }
}

2 个答案:

答案 0 :(得分:0)

如果您反转链接列表:

A -> B -> C -> D -> E (odd numbered case)
E -> D -> C -> B -> A

A -> B -> C -> D (even numbered case)
D -> C -> B -> A

你看到这些物品是如何改变的吗?在奇数编号的情况下,A交换的地方与E,B与D和C没有移动。

现在你知道如何通过循环来做到这一点吗?外部循环从列表的开头到中间点,内部循环定位匹配项以交换它们。

绝对不是反转链表的最有效方法,但我想这只是一种让你更多地思考数据结构的方法。

您发布的反向()没有意义,因为指针值不正确。使用back初始化为NULL,while循环根本不会执行。

答案 1 :(得分:0)

我不确定您的老师希望您使用哪种API reverse

  • 最简单的一个将采用Node *并返回新的头指针。您可以main head = reverse(head);
  • Node *reverse(Node *head) { Node *front = head; Node *newhead = NULL; while (front) { Node *back = front->next; front->next = newhead; newhead = front; front = back; } return newhead; } 调用它

以下是此方法的简单实现:

reverse
  • 替代API会使Node **获取指向头指针的指针,因此为void reverse(Node **headp) { Node *front = *headp; Node *newhead = NULL; while (front) { Node *back = front->next; front->next = newhead; newhead = front; front = back; } *headp = newhead; } ,并更新指向反转列表。

以下是它的工作原理:

# configure Java  http://www.jenv.be/
# install Java: brew cask install java, brew cask install java7
# set global default: setJavaGlobal 1.7, jenv global 1.7
# set local folder default: jenv local 1.8
#
JENV_HOME=$HOME/.jenv
export PATH=.:$PATH:$JENV_HOME/bin
eval "$(jenv init -)"
export JAVA_HOME="$HOME/.jenv/versions/`jenv version-name`"
alias jenv_set_java_home='export JAVA_HOME="$HOME/.jenv/versions/`jenv version-name`"'

请注意,您不需要嵌套循环。

另请注意,您不应该隐藏typedef背后的指针,这是不好的做法,容易出错并且会给下一位读者和原作者造成混淆。