如何通过 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;
}
我是 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;
}