【发布时间】:2021-05-10 13:26:41
【问题描述】:
我应该编写一个名为“disAssemblyList”的函数,它获取一个字符的链接列表(没有虚拟元素)。该函数应该将带有大字母的节点移动到“bigLetter”链表(没有虚拟元素),将带有小字母的节点移动到“smallLetter”链表,nums到“nums”链表,其他字符保留在原始列表中。
我需要通过引用传递 smallLetter、bigLetter 和 nums 链表并返回带有其他字符的列表。
我需要扫描原始列表。原始列表可以为空。
例如:
原始链表:
3-> a-> 7-> M-> K-> u-> 5-> #-> &-> P-> %-> A
bigLetter:
M-> K-> P-> A
smallLetter:
a-> u
nums:
3-> 7-> 5
其他字符(函数运行后的原始列表):
#-> &-> %
我编写了这段代码,但我似乎无法理解如何使它工作。 它不会将字符扫描到链表。
typedef struct chNode
{
char data;
struct chNode *next;
}chNode;
chNode * createCharList(char data)
{
chNode *temp = (chNode*)malloc(sizeof(chNode));
temp->data = data;
temp->next = NULL;
return temp;
}
chNode * addCharToLast(chNode *head, char data)
{
chNode *p = head;
chNode *temp = createCharList(data);
if (head == NULL)
return temp;
while (p->next != NULL)
p = p->next;
p->next = temp;
return head;
}
void printf_CharList(chNode *head)
{
chNode *p = head;
while (p != NULL)
{
printf("%d, ", p->data);
p = p->next;
}
printf("\n\n");
}
chNode* insert_Charlist() // A function that imports numbers into a linked list , till -1
{
char ch;
chNode *Head = NULL;
printf("Enter chars For Linked-List Till 'Enter':\n");
//5scanf_s("%c", &ch);
ch = getchar();
while (ch != "\n")
{
Head = addCharToLast(Head, ch); //Makes last number to be First
//scanf_s("%c", &ch);
ch = getchar();
}
return Head;
}
void add_to_other_list(chNode** head, chNode* p)
{
static chNode* tail = NULL;
p->next = NULL;
if (tail == NULL)
{
*head = p;
}
else
{
tail->next = p;
}
tail = p;
}
chNode* disAssemblyList(chNode* p, chNode **bigLetter, chNode **smallLetter, chNode **nums)
{
chNode* t = NULL;
if (p == NULL) return p; // 0 elements
if (p->next == NULL) return p; // 1 element
if (p->next->next == NULL) // 2 elements
{
if ((p->next->data >= 65) && (p->next->data) <= 90)
{
// Move p->next to other list
add_to_other_list(&(*bigLetter), p->next);
p->next = NULL;
return p;
}
}
// Repeat as long as the list has minimum 3 elements
while (p->next)
{
if ((p->next->data >= 65) && (p->next->data) <= 90)
{
// Move p-next
t = p->next;
p->next = p->next->next;
add_to_other_list(&(*bigLetter), t);
}
if ((p->next->data >= 97) && (p->next->data) <= 122)
{
t = p->next;
p->next = p->next->next;
add_to_other_list(&(*smallLetter), t);
}
if ((p->next->data >= 48) && (p->next->data) <= 57)
{
t = p->next;
p->next = p->next->next;
add_to_other_list(&(*nums), t);
}
p = p->next;
}
return p;
}
void main()
{
chNode *Orignial_list = NULL;
chNode *bigLetter = NULL;
chNode *smallLetter = NULL;
chNode *nums = NULL;
Orignial_list = insert_Charlist(); // Function that imports a list
printf("You Entered This linked-list:\n");
printf_CharList(Orignial_list); //Printing the linked list
Orignial_list = disAssemblyList(Orignial_list,&bigLetter,&smallLetter,&nums);
printf("The BigLetter Linked-List is:\n");
printf_CharList(bigLetter);
printf_CharList(smallLetter);
printf_CharList(nums);
printf_CharList(Orignial_list);
getch();
}
【问题讨论】:
-
您好,欢迎来到 StackOverflow。这是相当多的代码要经过,所以也许试着把它减少到一个“最小的可重现的例子”。例如,尝试只为初学者使用一个列表。此外,“不起作用”是一个非常通用的错误描述(但我们得到的最多)。您是否尝试过在调试器中单步执行您的代码并按照步骤操作?这可能会帮助您弄清楚事情的发展方向。
-
@RefugnicEternium 尝试在这样的评论中输入
[mre]。对你来说更快,对 OP 更有帮助。 -
我很抱歉,@Yunnosch,我通常不是第一个发布这个的,所以我不知道快捷方式。感谢您的提醒。 :) 所以是的,我们可能会要求您发布minimal reproducible example。
-
请尝试
while (ch != '\n')和printf("%c, ", p->data);,然后我们可以开始讨论实际的算法问题。 -
正如 Yunnosh 已经正确指出的那样,您的问题可能已经出现在“输入”向量上,您似乎在等待字符“直到输入”。但是在那个时候,您将
char与const char *进行比较,这应该已经给您一个编译错误。
标签: c split linked-list singly-linked-list function-definition