|
发表于 2023-12-21 11:39:56
|
显示全部楼层
非常抱歉,我之前回答的确有误。现在我来解释一下你提供的代码中的问题。
首先,你的链表初始化逻辑是正确的,它会形成一个循环链表。所以初始化链表的部分没有问题。
然而,在`PrintCeasar`函数中,你使用了一个错误的指针:`DuLinkList temp = (*L)->next;`,这个指针指向的是链表的第一个节点,而不是头节点。所以你需要修改为`DuLinkList temp = *L;`。
另外,如果你希望输出大写字母,你需要将 `temp->data` 改为 `temp->data + 'A'`。
修改后的代码如下所示:
- #include <stdio.h>
- #include <stdlib.h>
- #define OK 1
- #define ERROR 0
- typedef char ElemType;
- typedef int Status;
- typedef struct DualNode {
- ElemType data;
- struct DualNode* prior;
- struct DualNode* next;
- } DualNode, *DuLinkList;
- Status InitList(DuLinkList* L) {
- DualNode* p, * q;
- int i;
- *L = (DuLinkList)malloc(sizeof(DualNode));
- if (!(*L)) {
- return ERROR;
- }
- (*L)->next = (*L)->prior = NULL;
- p = (*L);
- for (i = 0; i < 26; i++) {
- q = (DualNode*)malloc(sizeof(DualNode));
- if (!q) {
- return ERROR;
- }
- q->data = 'A' + i;
- q->prior = p;
- q->next = p->next;
- p->next = q;
- p = q;
- }
- p->next = (*L)->next;
- (*L)->next->prior = p;
- return OK;
- }
- void Caesar(DuLinkList* L, int i) {
- if (i > 0) {
- do {
- (*L) = (*L)->next;
- } while (--i);
- } else if (i < 0) {
- do {
- (*L) = (*L)->prior;
- } while (++i);
- }
- }
- void PrintCeasar(DuLinkList* L) {
- int i;
- DuLinkList temp = *L;
- for (i = 0; i < 26; i++) {
- temp = temp->next;
- printf("%c", temp->data + 'A');
- }
- printf("\n");
- }
- int main(void) {
- DuLinkList L;
- int n;
- InitList(&L);
- printf("请输入一个整数:");
- scanf("%d", &n);
- printf("\n");
- Caesar(&L, n);
- PrintCeasar(&L);
- return 0;
- }
复制代码
现在,你可以尝试输入负数了,应该不会再报错了。希望能帮助到你!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|