void split(lklist *head,lklist*&ha,lklist *&hb,lklist *&hc) { lklist *p; ha=0,hb=0,hc=0; for(p=head;p!=0;p=head) { head=p->next; p->next=0; if (p->data>='A' &&p->data<='Z') { p->next=ha; ha=p; } else if (p->data>='0' &&p->data<='9') { p->next=hb; hb=p; } else { p->next=hc; hc=p; } } }
时间: 2024-04-26 07:24:47 浏览: 86
这段代码实现了上面提到的 split 函数,具体实现过程如下:
首先初始化 ha、hb、hc 为 NULL,然后使用一个指针 p 遍历链表 head,对于每个节点,将其从链表中断开(p->next=0),然后根据节点的值将其插入到 ha、hb、hc 中对应的位置。
具体地,如果节点的值在 'A' 到 'Z' 的范围内,将其插入到链表 ha 的头部;如果节点的值在 '0' 到 '9' 的范围内,将其插入到链表 hb 的头部;否则,将其插入到链表 hc 的头部。最后返回三个链表的头节点。
需要注意的是,每次将节点插入到链表头部时,需要更新对应链表的头指针。
相关问题
下面是在单链表中删除值相同的多余结点的核心代码,请将其程序补充完整。 typedef int datatype; typedef struct node { 第一空 data; struct node *next; }lklist; void delredundant(lklist *& head) { lklist *p,*q,*s; for(p=head;p!=0;p=p->next) { for(q= 第二空 ,s=q;q!=0; ) if (q->data==p->data) {s->next=q->next; free(q);q=s->next;} else { 第三空 ,q=q->next;} } }
typedef int datatype;
typedef struct node {
datatype data;
struct node *next;
} lklist;
void delredundant(lklist *& head) {
lklist *p, *q, *s;
for (p = head; p != 0; p = p->next) {
for (q = p->next, s = p; q != 0; ) { // s指向q的前一个节点
if (q->data == p->data) {
s->next = q->next; // 将s的下一个节点指向q的下一个节点
free(q); // 释放q节点的空间
q = s->next; // q指向下一个节点
} else {
s = q; // s指向q
q = q->next; // q指向下一个节点
}
}
}
}
lklist *p,*q,*s; for(p=head;p!=0;p=p->next) { for(q=p->next,s=q;q!=0; ) if (q->data==p->data) {s->next=q->next; free(q);q=s->next;} else {s=q,q=q->next;}
这段代码是对于一个单链表中的重复元素进行删除操作。具体来说,它遍历了整个链表,对于每一个节点,再从它的下一个节点开始遍历,查找是否有与它相同的节点。如果找到了相同的节点,则将该节点从链表中删除;否则继续遍历下一个节点。其中,s指向当前节点p的前一个节点,q指向当前节点p的后一个节点。在删除重复节点时,需要将s的next指向q的next,并释放q的内存空间。
阅读全文