我在C++中的指针方面遇到了一些问题,我无法将元素添加到链表。
这是我的代码:
list.h
#include <iostream>
#define first(L) L.first
#define last(L) L.last
#define next(P) P->next
#define info(P) P->info
using namespace std;
typedef int infotype;
typedef struct elmlist *address;
struct elmlist{
infotype info;
address next;
};
struct List{
address first;
address last;
};
void createList(List &L);
address allocate(infotype x);
void insertLast(List &L, address P);
void printInfo(List L);
list.cpp
#include <iostream>
#include "list.h"
using namespace std;
void createList(List &L){
first(L) = NULL;
}
address allocate(infotype x){
address p = new elmlist;
info(p) = x;
next(p) = NULL;
return p;
}
void insertLast(List &L, address P){
last(L) = P;
}
void printInfo(List L){
address p = last(L);
while(p != NULL){
cout << info(p) << ", ";
p = next(p);
}
cout<<endl;
}
main.cpp
#include <iostream>
#include "list.h"
using namespace std;
int main()
{
List L;
infotype x;
address a;
for (int y = 0; y<10; y++){
cout<<"Digit " << y+1 << " : ";
cin>>x;
a = allocate(x);
insertLast(L,a);
}
cout<<"isi list: ";
printInfo(L);
return 0;
}
使用上面的代码,我的结果只显示以下输出:
Digit 1 : 1
Digit 2 : 2
Digit 3 : 3
Digit 4 : 4
Digit 5 : 5
Digit 6 : 6
Digit 7 : 7
Digit 8 : 8
Digit 9 : 9
Digit 10 : 0
isi list: 0,
我的预期输出是:1,2,3,4,5,6,7,8,9,0
以下是使其工作的方法:
- 初始化、
last
和first
nullptr
,这样我们就可以检测列表何时为空。
struct List
{
address first = nullptr;
address last = nullptr;
};
- 如果列表为空,请将
last
和first
都设置为添加元素。否则,使last
指向添加的元素,并设置新last
:
void insertLast(List &L, address P)
{
if(first(L) == nullptr){
first(L) = P;
last(L) = P;
return;
}
next(last(L)) = P;
last(L) = P;
}
- 修复了对元素的迭代,以便我们从乞求而不是结束开始:
void printInfo(List L)
{
address p = first(L);
除此之外,请不要以这种方式使用#define
。它使代码真的不可读。此外,您的C++代码更像是 C 风格,如果您尝试学习C++,这并不好。