现在这个代码是一个反向输出的链表,要怎么操作才能让他变成正向输出的啊,感谢
#include
#include
typedef struct Link *head;
struct Link {
int Data; /* 存储结点数据 */
head Next; /* 指向下一个结点的指针 */
};
typedef head List; /* 定义单链表类型 */
int main()
{
int N, i;
List L, p;
scanf("%d", &N);
L = NULL;
for ( i=0; imalloc(sizeof(struct Link));
scanf("%d", &p->Data);
p->Next = L; L = p;
}
while(L!=NULL)
{
printf("%d ",L->Data);
L=L->Next;
}
return 0;
}
可以使用递归的方式正向输出链表,即先递归输出链表的后续部分,再输出当前节点的值。具体实现可以参考下面的代码:
void PrintList(List L)
{
if(L != NULL)
{
PrintList(L->Next);
printf("%d ", L->Data);
}
}
这个函数会先递归输出链表的后续部分,即 PrintList(L->Next),然后再输出当前节点的值 printf("%d ", L->Data),这样就能正向输出整个链表了。在主函数中,可以调用这个函数代替原来的 while 循环输出。
PrintList(L);
#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
void printListForward(ListNode *head) {
ListNode *p = head;
while (p != NULL) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
int main() {
ListNode head(0);
ListNode inner_node_1(1);
ListNode inner_node_2(2);
ListNode inner_node_3(3);
head.next = &inner_node_1;
inner_node_1.next = &inner_node_2;
inner_node_2.next = &inner_node_3;
printListForward(&head);
return 0;
}
可以改成双链表,要么就插入的时候插入到链表尾,用一个变量存储链表尾。还有一个办法就是不改变当前逻辑,增加一个数组,输出时先输出到数组,再输出数组到屏幕
修改如下,供参考:
#include <stdio.h>
#include <stdlib.h>
typedef struct Link *head;
struct Link {
int Data; /* 存储结点数据 */
head Next; /* 指向下一个结点的指针 */
};
typedef head List; /* 定义单链表类型 */
int main()
{
int N, i;
List L, p;
scanf("%d", &N);
L = NULL;
for ( i=0; i<N; i++ ) {
//p = (List)malloc(sizeof(struct Link));
//p->Next = L; L = p; 这是头插法实现链表
if (!L){ //修改,以下尾插法建立链表
L = p = (List)malloc(sizeof(struct Link));
p->Next = NULL;
}
else{
p->Next = (List)malloc(sizeof(struct Link));
p = p->Next;
p->Next = NULL;
}
scanf("%d", &p->Data);
}
while(L!=NULL)
{
printf("%d ",L->Data);
L=L->Next;
}
return 0;
}