如何通过 ASCII 将字母添加到链表?

How to add letters to a linked list via ASCII?

我是 C 的新手,刚开始学习链表。我正在尝试用 c 语言设计一个链表结构,并且想知道如何才能将字母添加到我的 LL 中。过去对于整数,我只是简单地使用一个 for 循环和 i 并在它递增时将数字 i 添加到 LL 中。我如何才能对字母(例如 A、B、C)执行相同的操作?它涉及使用 ASCII 吗?我在网上搜索,发现 A 的 ASCII 是 65,想知道我是否可以以某种方式打印 ASCII...下面是一个尝试。

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

typedef struct node
{
    void* dataPtr;
    struct node* next;
} NODE;

typedef struct
{
    NODE* head;
    int count;
} LIST;

NODE* createNode (void* itemPtr)
{
    NODE* nodePtr;
    nodePtr = (NODE*) malloc (sizeof (NODE));
    nodePtr->dataPtr = itemPtr;
    nodePtr->next = NULL;
    return nodePtr;
}

LIST* createList(void)
{
    LIST* list;
    list= (LIST*) malloc (sizeof (LIST));
    if (list)
    {
        list->head = NULL;
        list->count = 0;
    }
    return list;
}

bool insertList (LIST* list, void* itemPtr)
{
    NODE* newPtr;
    if (!(newPtr = (NODE*)malloc(sizeof(NODE)))) return false;
    newPtr->dataPtr = itemPtr;
    newPtr->next = list->head;
    (list->count)++;
    list->head = newPtr;
    return true;
}

int main (void)
{
    char* newDataP;
    LIST* sList;
    sList = createList();

    for (int i = 1; i<=26; i++){
        newDataP = (char*) malloc (sizeof(int));
        *newDataP = 64+i;
        insertList (sList, newDataP);
    }

    //print out the chars, I'm trying to do the 26 capitalized letters, which is why
    //I started at 64

    return 0;
}

您的代码似乎将字母正确存储到链表中。因此,您可能正在使用 printf("%d", var) 打印变量。在 C 中,char 是整数,所以如果你想打印一个 char 你应该使用 printf("%c", var)

如果你想改进你的代码,你应该使用 (char*)malloc(sizeof(char))。而不是写64你可以直接写'A',因为'A'是A在ASCII中的值是64

你对 void 指针的使用让我假设你正在尝试制作一些通用链表。你可以这样做,但它通常比在 C 中的价值更麻烦。所以,如果你只想要一个特定类型的列表,你通常最好为该类型制作一个特定的数据结构。如果你使用void *,你必须使用指针,这涉及到很多内存管理,你几乎失去了所有的类型检查,我一般认为在 95% 的情况下不值得这样做。

如果您只想将 char 作为链接中的数据,请使用 char。然后,就没什么了。

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

struct node
{
    char data; // Use an actual char for the data
    struct node *next;
};

// Unless you really need the count (it is rare that you do),
// then you don't need a list structure. You can use a link as
// the head of a list and get all of the same benefits. But here
// is a list.
struct list
{
    struct node *data;
    int count;
};

// For initialising a list, we just need to set data to NULL
// and count to zero, so we might as well return a struct.
// notice: doesn't return a pointer
struct list
newList(void)
{
    return (struct list){.data = NULL, .count = 0};
}

struct node *
createNode(char data, struct node *next)
{
    struct node *node = malloc(sizeof *node);
    assert(node); // handle alloc failures
    *node = (struct node){.data = data, .next = next};
    return node;
}

bool insertList(struct list *list, char data)
{
    list->data = createNode(data, list->data);
    list->count++;
    return true;
}

int main(void)
{
    struct list list = newList();

    const char *some_data = "abcdABCD";
    for (const char *c = some_data; *c; c++)
    {
        insertList(&list, *c);
    }

    // insert prepends, so the data is reversed compared
    // to some_data.
    for (struct node *n = list.data; n; n = n->next)
    {
        printf("looking at %c\n", n->data);
    }

    return 0;
}