我的输入文件是
1
2
3
4
5
我的输出应该看起来像
1 -> NULL
2 -> 1 -> NULL
3 -> 2 -> 1 -> NULL
4 -> 3 -> 2 -> 1 -> NULL
5 -> 2 -> 3 -> 2 -> 1 -> NULL
这是我的职能
void printList(Node* first)
{
Node *temp;
temp=first;
printf("elements in linked list aren");
while(temp!=NULL)
{
printf("%d -> NULLn",temp->value);
temp=temp->next;
}
}
这是完整的程序
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int value;
struct node* next;
}Node;
Node* createNode(int data);
Node* insertFront(Node* first, Node* newNode);
void printList(Node* first);
void deleteList(Node* first);
int main(int argc, const char **argv)
{
int numItems, ch;
FILE *fp;
numItems = 0;
fp = fopen(argv[1], "r");
if(fp == NULL)
{
fclose(fp);
return -1;
}
while ((ch = getc(fp)) != EOF)
{
if (ch = 'n') numItems++;
}
fclose(fp);
Node *first = NULL;
Node *newNode;
Node *Next;
int i;
for(i = 1; i <= numItems; i++)
{
newNode = createNode(i);
first = insertFront(first, newNode);
}
printList(first);
deleteList(first);
return 1;
}
Node* createNode(int data)
{
Node *newNode;
newNode = malloc(sizeof(Node));
newNode -> value = data;
newNode -> next = NULL;
return newNode;
}
Node* insertFront(Node* first, Node* newNode)
{
if (newNode == NULL) {
/* handle oom */
}
newNode->next=NULL;
if (first == NULL) {
first = newNode;
}
else {
Node *temp=first;
while(temp->next!=NULL)
{
temp = temp->next;
}
temp->next=newNode;
first = newNode;
}
return first;
}
void printList(Node* first)
{
Node *temp;
temp=first;
printf("elements in linked list aren");
while(temp!=NULL)
{
printf("%d -> NULLn",temp->value);
temp=temp->next;
}
}
void deleteList(Node* first)
{
Node *temp;
temp=first;
first=first->next;
temp->next=NULL;
free(temp);
}
谁能用这个给我指出正确的方向,我正在乘坐链表斗争巴士过来。提前谢谢。
你有几个错误。由于这是一项学习作业,我会描述错误而不是纠正您的代码:
- 您正在为每个元素打印
-> NULL
;只有在循环完成后才应打印它。换句话说,各个行应该使用"%d -> "
格式,然后在循环之后你应该打印"NULLn"
。 - 您的
deleteList
不正确:您需要在那里有一个循环,类似于您在printList
中的循环
您创建 - 列表的方式看起来很可疑:您不是读取文件,而是数行,然后创建
0
、1
、2
、...基于行数。您应该将文件中的数据读取到列表中;您可以在执行计数的同一循环中执行此操作,因为链表不需要预先知道它们的长度。
如果您希望打印看起来像您显示的示例,则应将void printList(Node* first)
更改为如下所示的内容:
while(temp!=NULL)
{
if( temp->next )
printf("%d ->",temp->value);
else
printf("%d -> NULLn",temp->value);
temp=temp->next;
}
为了正确生成堆栈并确保在需要时正确删除,您需要修复dasblinkenlight
的答案中提到的问题。完成后,您的特定问题,如何根据需要打印输出:
1->NULL
2->1->NULL
依此类推,最好用递归调用来解决:
void printList (Node* stack) {
Node* pCur = stack; // you could just use stack, you don't have to have pCur
if (pCur) {
printList (pCur->next);
while (pCur->next) {
printf ("%d->", pCur->value)
pCur = pCur->next;
}
printf ("%d->NULLn", pCur->value);
}
return;
}