我需要一些帮助。
我星期三有这个家庭作业,我唯一无法做的就是扭转我的链表。我整天都在努力工作。
我的教授没有告诉我们任何方式这样做,也不允许我们给他发电子邮件,所以我有点卡住了。
他希望我们通过使用嵌套的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;
}
}
答案 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
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背后的指针,这是不好的做法,容易出错并且会给下一位读者和原作者造成混淆。