迭代链表并将每个值打印到屏幕C上

时间:2013-09-08 22:57:46

标签: c linked-list

我的输入文件是

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 are\n");
    while(temp!=NULL)
    {
        printf("%d -> NULL\n",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 are\n");
    while(temp!=NULL)
    {
        printf("%d -> NULL\n",temp->value);
        temp=temp->next;
    }
}

void deleteList(Node* first)
{
    Node  *temp;
    temp=first;
    first=first->next;
    temp->next=NULL;
    free(temp);
}

任何人都可以指出我正确的方向,我骑在这里的链表斗争巴士。提前谢谢。

3 个答案:

答案 0 :(得分:1)

你有几个错误。由于这是一项学习任务,我会描述错误而不是纠正您的代码:

  • 您正在为每个元素打印-> NULL;你应该只在循环结束时打印它。换句话说,各行应使用"%d -> "格式,然后在循环后打印"NULL\n"
  • 您的deleteList不正确:您需要一个循环,类似于printList
  • 中的循环
  • 您创建列表的方式看起来很可疑:不是阅读文件,而是计算行数,然后创建012,...的列表在线数。您应该将文件中的数据读入您的列表;你可以在计数的同一个循环中完成它,因为链接列表不需要事先知道它们的长度。

答案 1 :(得分:0)

如果您希望打印看起来像您展示的示例,则应将void printList(Node* first)更改为以下内容:

while(temp!=NULL)
{
    if( temp->next )
        printf("%d ->",temp->value);
    else
        printf("%d -> NULL\n",temp->value);
    temp=temp->next;
}

答案 2 :(得分:0)

为了正确生成堆栈并确保在需要时正确删除,您需要解决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->NULL\n", pCur->value);
    }
    return;
}