33,311
社区成员
发帖
与我相关
我的任务
分享
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef char ElemType;
typedef struct Node {
ElemType data;
struct Node *next;
}LinkNode;
void CreateListR(LinkNode *&L, ElemType a[], int n)
{
LinkNode *node = NULL;
int i = 0;
L = (LinkNode *)malloc(sizeof(LinkNode));
L->next = NULL;//创建头结点,其next域设置为NULL
LinkNode *p = L;
for(i=0; i<n; i++)
{
node = (LinkNode *)malloc(sizeof(LinkNode));
node->data = a[i];
node->next = NULL;
p->next = node;
p = node;
}
}
void DispList(LinkNode *L)
{
LinkNode *p = L->next;
while(p)
{
printf("%c ",p->data);
p = p->next;
}
printf("\n");
}
void Split(LinkNode *L, ElemType x)
{
//两个链表的头指针,用两个小链表储存小于和大于部分
LinkNode* pLeftHead = (LinkNode *)malloc(sizeof(LinkNode));//小的
LinkNode* pRightHead = (LinkNode *)malloc(sizeof(LinkNode));//大的
//两个链表的当前最后一个元素
LinkNode* left = pLeftHead;
LinkNode* right = pRightHead;
LinkNode* p = L->next;
while(p != NULL)
{
if (p->data < x)
{
left->next = p;
left = p;
}
else
{
right->next = p;
right = p;
}
p = p->next;
}
//将right连接到left尾部,将两个链表合成一个 分割好的
left->next = pRightHead->next;
right->next = NULL;
L->next = pLeftHead->next;
free(pLeftHead);
free(pRightHead);
}
void DestroyList(LinkNode* L)
{
LinkNode* node = L->next;
while(L != NULL)
{
node = L->next;
free(L);
L = node;
}
}
int main()
{
LinkNode *L = NULL;
ElemType a[] = "fgbedhca";
int n = strlen(a);
CreateListR(L, a, n);
printf("划分前 L: ");
DispList(L);
ElemType x = 'd';
printf("以%c进行划分\n", x);
Split(L, x);
printf("划分后 L: ");
DispList(L);
DestroyList(L);
return 0;
}