将整数表示为链表

时间:2012-09-02 10:00:00

标签: c integer linked-list

在C中编写一个表示整数作为单链表的函数,负整数的减号不显示。我究竟做错了什么?您能否建议算法的任何改进,以及解决它的最快方法? C noob在这里。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char info;
    struct Node *link;
} Node;

Node* add_front (Node* head, char info)
{
    Node* t = malloc(sizeof(struct Node));
    t->info = info;
    t->link = head;
    return t;
}

void display (Node* head)
{
    while(head != NULL) {
        printf("%d   ", head->info);
        head = head->link;
    }
}

Node* number_list (int n)
{
    int digit, minus = (n < 0 ? 1 : 0);
    Node* list = NULL;

    if (minus) n *= -1;

    do {
        digit = n % 10;
        list = add_front(list, (char)digit);
        n = n / 10;
    } while(n > 0);

    if (minus) add_front(list, '-');

    return list;
}

int main()
{
        int n = -1024;
        Node* l = number_list(n);
        display(l);
        return 0;
}

1 个答案:

答案 0 :(得分:2)

if(minus) {
   add_front(list, '-');
}

由于add_front返回列表的新头部,您必须执行

if(minus) {
  list =  add_front(list, '-');
}

下一个问题出在你的显示功能中,

 printf("%d   ", head->info);

将char作为数字打印,打印char '-'作为数字不会打印减号,但是a -的值为acii中的43。

更改显示功能

while(head != NULL) {
   if(head->info == '-') {
       putchar('-'); 
   }else {
     printf("%d   ", head->info);
   }
    head = head->link;
}

或者将实际的字符数字存储在列表中,然后使用printf("%c", head->info);打印元素。也就是说,而不是例如在列表中存储号码7,您可以存储字符数字'7'

你可以做些什么
list = add_front(list, (char)('0'+digit));