1.功能描述:
假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3包含L中的所有大写字母结点。
2.关键源码:
头文件 ListNode.h
#include<iostream>
using namespace std;
typedef struct ListNode
{
char data;
struct ListNode *next;
};
void InitList(ListNode*& L);
void function(ListNode* L, ListNode* L1, ListNode* L2, ListNode* L3);
void CreatListR(ListNode*& L, char c[], int n);
void display(ListNode* L);
function.cpp
#include "ListNode.h"
void InitList(ListNode*& L)//建立一个新的头节点
{
L = (ListNode*)malloc(sizeof(ListNode));
L->next = NULL;
}
void CreatListR(ListNode*& L, char c[], int n)//尾插法初始化
{
ListNode* s, * r;
L = (ListNode*)malloc(sizeof(ListNode));
r = L;
for (int i = 0; i < n; i++)
{
s = (ListNode*)malloc(sizeof(ListNode));
s->data = c[i];
r->next = s;
r = s;
}
r->next = NULL;
}
void display(ListNode* L)
{
ListNode* p = L->next;
while (p!= NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
void function(ListNode *L,ListNode * L1,ListNode * L2,ListNode * L3)
{
ListNode* p = L->next;
ListNode* s1, * r1;
r1 = L1;//指向L1表尾
ListNode* s2, * r2;
r2 = L2;//指向L2表尾
ListNode* s3, * r3;
r3 = L3;//指向L3表尾
while (p!= NULL)
{
if (p->data >= 48 && p->data <= 57)//数字
{
s1 = (ListNode*)malloc(sizeof(ListNode));
s1->data =p->data;
r1->next = s1;
r1 = s1;
}
else if (p->data >= 97 && p->data <= 122)//小写
{
s2 = (ListNode*)malloc(sizeof(ListNode));
s2->data = p->data;
r2->next = s2;
r2 = s2;
}
else if(p->data>=65 &&p->data<=90)//大写
{
s3 = (ListNode*)malloc(sizeof(ListNode));
s3->data = p->data;
r3->next = s3;
r3 = s3;
}
p = p->next;
}
r1->next = NULL;
r2->next = NULL;
r3->next = NULL;
}
主函数
#include "ListNode.h"
int main()
{
char a[] = "123ADCsdf";
ListNode* L = new ListNode();
ListNode* L1 = new ListNode();
ListNode* L2 = new ListNode();
ListNode* L3 = new ListNode();
int n = sizeof(a)/sizeof(a[0]);
CreatListR(L, a, n);
InitList(L1);
InitList(L2);
InitList(L3);
function(L, L1, L2, L3);
display(L);
display(L1);
display(L2);
display(L3);
}
3.成果展示
