本文的内容是使用C语言分割单向链表,给出一个链表和一个值,要求链表中小于给定值的节点全都位于大于或等于给定值的节点之前,打印原始链表的所有元素和经此操作之后链表的所有元素。
分析:本题只是单向链表的分割,不涉及排序,因此把小于给定值的节点连成一个链表,再把大于等于给定值的节点连成一个链表,然后把两个链表再链接到一起即可形成题目要求的链表。
注意:要记住两个链表各自的头节点,不然最后没办法连接到一起;存放大值的链表最后要指向NULL;两个链表的头节点要动态申请内存,用以保存分割链表后的两个头节点。
完整的源代码如下。
#include <stdio.h>
#include <stdlib.h>
typedef struct linklist
{
int data;
struct linklist *next;
}Linklist;
Linklist *CreateLinkList()
{
int n = 0;
Linklist *head,*p,*q;
head = NULL;
p = (Linklist *)malloc(sizeof(Linklist));
printf("input data %d (input 65535 end):",n+1);
scanf("%d",&p->data);
if(p->data == 65535)
return head;
while(1)
{
n++;
if(n==1)
head = p;
else
q->next = p;
q = p;
p = (Linklist *)malloc(sizeof(Linklist));
printf("input data %d (input 65535 end):",n+1);
scanf("%d",&p->data);
if(p->data == 65535)
break;
}
q->next = NULL;
return head;
}
Linklist *divide(Linklist* head,int x)
{
Linklist *p = (Linklist*)malloc(sizeof(Linklist));
Linklist *q = (Linklist*)malloc(sizeof(Linklist));
Linklist *headp;
Linklist *headq;
headp = p;
headq = q;
while(head != NULL)
{
if(head->data < x)
{
p->next = head;
p = p->next;
}
else
{
q->next = head;
q = q->next;
}
head = head->next;
}
p->next = headq->next;
q->next = NULL;
return headp->next;
}
void print_linklist(Linklist *head)
{
Linklist *p;
p = head;
if(head != NULL)
{
do{
printf("%d ",p->data);
p = p->next;
}while(p != NULL);
printf("\n");
}
else
printf("The link list is empty!\n");
}
void main()
{
Linklist *head;
head = CreateLinkList();
printf("原链表序列:");
print_linklist(head);
head = divide(head,10);
printf("分割后链表序列:");
print_linklist(head);
}
上面程序的结果如下图所示。
根据上面的运行结果可以看到,代码满足题目的要求。