【数据结构·C语言】请高手帮忙检查一个关于【分割链表成子链表】的算法是否正确

2024-11-17 13:18:52
推荐回答(1个)
回答1:

楼主你好

你的代码写的有些繁琐 可读性不是很高
所以我帮你写了一个 供你参考:
#include
#include
typedef struct node{
char ch;
struct node *next;
}*LinkList,Node;
void Create_List(LinkList &h)
{
LinkList p,rear;//p用于插入 rear是尾指针
h = (LinkList)malloc(sizeof(Node));
h->next = NULL;
rear = h;
printf("输入一串字符(回车结束):\n");
do{
p = (LinkList)malloc(sizeof(Node));
scanf("%c",&(p->ch));
rear->next = p;
rear = p;
}while(getchar()!='\n');//回车结束输入
rear->next = NULL;
}
void Disp_List(LinkList h)
{
LinkList p = h->next;//用于输出
while(p)
{
printf("%c\n",p->ch);
p = p->next;
}
}
void Cut(LinkList h, LinkList &Ch,LinkList &In,LinkList &Ot)
{
LinkList p,q;//p用于遍历主链表h q用于插入
Ch = (LinkList)malloc(sizeof(Node));
In = (LinkList)malloc(sizeof(Node));
Ot = (LinkList)malloc(sizeof(Node));
Ch->next = NULL;
In->next = NULL;
Ot->next = NULL;
p = h->next;
while(p)
{
q = (LinkList)malloc(sizeof(Node));//每次要重新分配插入结点的地址空间 否则q总是指向一个地址空间
q->ch = p->ch;//给插入结点q赋结点信息ch
if(q->ch >='0' && q->ch <='9')//如果是数字 插入到数字链表
{
q->next = In->next;
In->next = q;
}
else if((q->ch >='a' && q->ch <='z') || (q->ch >='A' && q->ch <='Z'))//如果是字母 插入到字母链表
{
q->next = Ch->next;
Ch->next = q;
}
else//插入到其他字符链表中
{
q->next = Ot->next;
Ot->next = q;
}
p = p->next;
}
}
int main()
{
LinkList L,Char,Integer,Other;//分别是链表L、字母链表、数字链表、其他符号链表
Create_List(L);
Cut(L,Char,Integer,Other);//分割链表
printf("字母有:\n");
Disp_List(Char);
printf("数字有:\n");
Disp_List(Integer);
printf("其他字符有:\n");
Disp_List(Other);
return 0;
}

希望能帮助你哈