有一个带头结点的单链表l=(a1,b1,a2,b2,…an,bn),设计一个算法将其拆分成两个带头结点的单链表l1和l2,其中l1=(a1,a2,…an),l2=(b1,b2,…,bn),要求l1使用l的头节点。 单链表的数据结构为: typedef int datatype; typedef struct node { datatype data; struct node *next; }lnode, *linklist;
时间: 2023-05-02 19:02:29 浏览: 205
3-2 试编写一个算法,在带表头结点的单链表中寻找第i个结点.doc
题目要求设计一个算法,将一个带头结点的单链表L=(a1,b1,a2,b2,…,an,bn)拆分成两个带头结点的单链表L1和L2,其中L1=(a1,a2,…,an)、L2=(b1,b2,…,bn),要求L1使用L的头节点,单链表的数据结构可以用如下代码实现:
typedef int datatype;
typedef struct node {
datatype data;
struct node *next;
} lnode, *linklist;
具体实现方法可以按照以下步骤进行:
1. 定义两个指针变量p和q,分别指向原链表的头节点L和L2;
2. 用p指针遍历原链表L,每次取出一个节点a,将其插入到L1表的末尾;
3. 用q指针遍历原链表L,每次取出一个节点b,将其插入到L2表的末尾;
4. 待p遍历完整个链表后,将L2表的头节点(即q指向的节点)的next字段设置为NULL,以形成带头结点的单链表L2;
5. 返回L1和L2链表的头节点即可。
具体代码实现如下:
void splitList(linklist L, linklist *L1, linklist *L2) {
linklist p,q,s;
*L1 = L;
p = L;
q = *L2 = L->next;
s = q;
while (p->next != NULL) {
// 分别将a和b节点插入到对应的链表中
s = q;
q = q->next;
p->next = q;
s->next = q->next;
q->next = NULL;
p = p->next;
}
}
阅读全文