我在Objective C中创建了一个链接列表,它在很大程度上起作用。唯一的问题是,当我从列表中打印项目时,它还会在打印每个项目后打印0。
代码的输出是:
5 0 6 0 7
我想弄清楚为什么0出现以及如何阻止它。代码是:
Node类头文件
@interface Node : NSObject {
NSInteger data;
}
-(id) initWith : (NSInteger) number;
@property (nonatomic) NSInteger getData;
@property (nonatomic, strong) Node *nextNode;
Node类实现文件
-(id) initWith: (NSInteger)number {
self = [super init];
if (self) {
Node *node = [[Node alloc] init];
self.nextNode = node;
data = number;
}
return self;
}
-(id) init {
self = [super init];
if (self) {
// custom initialization
}
return self;
}
-(NSInteger)getData {
return data;
}
LinkedList标头文件
@interface LinkedList : NSObject {
NSInteger data;
}
-(id)initWith : (NSInteger) number;
-(void) insertInteger : (NSInteger) number;
-(void) printList;
LinkedList实现文件
@implementation LinkedList
{
Node *head;
}
-(id)initWith:(NSInteger)number {
self = [super init];
if (self) {
if (head == nil) {
head = [[Node alloc] initWith:number];
}
}
return self;
}
-(id) init {
self = [super init];
if (self) {
// custom initialization
}
return self;
}
-(void) insertInteger:(NSInteger)number {
if (head == nil) {
head = [[Node alloc] initWith:number];
}
else {
// traverse to the end of the linked list
Node *currentNode = head;
while (currentNode.nextNode != nil) {
currentNode = currentNode.nextNode;
}
// add the item at the end of the list
Node *insertNode = [[Node alloc] initWith:number];
[currentNode setNextNode:insertNode];
}
}
-(void) printList {
if (head == nil) {
NSLog(@"List is empty");
}
else {
Node *currentNode = head;
while (currentNode.nextNode !=nil) {
NSLog(@"%tu", currentNode.getData);
currentNode = currentNode.nextNode;
}
}
}
主要类文件
int main(int argc, const char * argv[])
{
LinkedList *list1 = [[LinkedList alloc] init];
[list1 insertInteger:5];
[list1 insertInteger:6];
[list1 insertInteger:7];
[list1 printList];
return 0;
}
答案 0 :(得分:1)
问题似乎在于,每次创建节点时,新节点都会创建另一个节点,并使其成为下一个节点" next"节点。为什么?不要创建第二个节点,只需将nextNode
设置为nil
。
所以基本上你在每个正确的节点之间都有一个额外的节点。
您需要调整所有代码才能遍历列表。例如,打印应该是:
-(void) printList {
if (head == nil) {
NSLog(@"List is empty");
}
else {
Node *currentNode = head;
while (currentNode) {
NSLog(@"%tu", currentNode.getData);
currentNode = currentNode.nextNode;
}
}
}