如何通过ASCII编码向C语言链表中添加字母元素?
C语言链表插入字母元素问题解答
常见疑问解答
- 是否需要用到ASCII编码?
C语言的char类型本质是整数类型,底层存储的就是字符对应的ASCII数值,所以你完全可以通过ASCII值操作字母,也可以直接用'A'这类字符字面量编写代码,二者在编译后是完全等价的。 - 是否可以通过ASCII值直接打印对应字母?
可以,使用printf的%c格式控制符即可,例如printf("%c", 65)和printf("%c", 'A')的输出结果都是大写字母A。
现有代码的问题修正
你现有代码逻辑基本正确,只存在2个小问题,补充缺失的打印逻辑即可正常运行:
- 为字符分配内存时误用了
sizeof(int),应该替换为sizeof(char),避免不必要的空间浪费。 - 你使用了头插法插入节点,最终链表默认存储顺序是Z到A,如果需要正序A到Z的输出,可以调整循环逻辑,或者修改为尾插法。
修正后的完整代码
#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(); // 头插法倒序插入即可得到A到Z的正序存储效果 for (int i = 26; i >= 1; i--){ newDataP = (char*) malloc (sizeof(char)); // 也可以写成 *newDataP = 'A' + i -1,不需要记忆ASCII数值,可读性更高 *newDataP = 64 + i; insertList (sList, newDataP); } // 遍历打印链表 NODE* curr = sList->head; while(curr != NULL) { // 用%c格式符输出对应字符 printf("%c ", *(char*)curr->dataPtr); curr = curr->next; } printf("\n"); // 补充内存释放逻辑,避免内存泄漏 curr = sList->head; while(curr != NULL) { NODE* temp = curr; free(curr->dataPtr); curr = curr->next; free(temp); } free(sList); return 0; }
内容的提问来源于stack exchange,提问作者Ides784
相关产品推荐
相关产品推荐

