算法分析:
半封装一个单链表LA,引用Creat()函数利用尾插法来生成链表,先输入n值来确定单链表中数据元素的个数,然后通过键盘输入元素,创建3个空链表来存放三种不同字符类型,通过Match()中的ASCII码值来判断字符类型,通过Insert()插入之前的三个空链表中。最后将三个空链表通过Circular()完成循环链表。
程序流程图:
程序如下:
/*author:雷桂艺
time:2021年12月6日9:45
version:1.0
description:先封装一个单链表LA,引用Creat()函数利用尾插法来生成链表,先输入n值来确定单链表中数据元素的个数,然后通过键盘输入元素,创建3个空链表来存放三种不同字符类型,通过Match()中的ASCII码值来判断字符类型,通过Insert()插入之前的三个空链表中。最后将三个空链表通过Circular()完成循环链表。
*/
#include <stdio.h>
#include <stdlib.h>
//封装单链表
typedef struct node
{
char data;
struct node *next;
}LNode,*PLinkList;
//尾插法创建链表
PLinkList Create()
{
PLinkList p, q, head;//定义三个指针,其中p类似一个辅助指针,用来存放所输入的链表数据
int n;
int i = 0;
head = (PLinkList)malloc(sizeof(node));
head->next = NULL;//令表为空
q = head;
printf("你想要输入多少个数据:\n");
scanf_s("%d", &n);
printf("请输入字符:\n");
for (i = 0; i <= n; i++)
{
p = (PLinkList)malloc(sizeof(node));//创建数据节点
scanf_s("%c", &p->data);
p->next = q->next;
q->next = p;
q = p;
}
return head;
}
//创建空表:
PLinkList CreatNULL()
{
PLinkList head;
head = (PLinkList)malloc(sizeof(node));
head->next = NULL;//令表为空
return head;
}
//输出打印链表:
void Showlist(PLinkList L)
{
PLinkList p;
p = L->next;
while (p != NULL)
{
printf("%c,", p->data);
p = p->next;
}
}
//将单链表变成循环链表
void Circular(PLinkList L)
{
PLinkList p;
p = L;
if (p->next)
{
p = p->next;
}
p->next = L;
}
void Insert(PLinkList &L, int i, char e)//在带头结点的单链表L中第i个数据元素之前插入数据元素
{
PLinkList s, p;
int j;
p = L;
for (j = 0; p && j<i - 1; j++)
p = p->next;
if (!p || j>i - 1)
printf("i值有误\n");
s = (PLinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
//将输入的字符进行分类:
void Match(PLinkList L, PLinkList &LA, PLinkList &LB, PLinkList &LC)//将元素分类
{
PLinkList p;
int i = 1, j = 1, k = 1;
p = L->next;
while (p)
{
//ASCII码33-47和58-63为字符,48-57为数字,65-90和97-122分别为大写字母和小写字母
if (((p->data)>64 && (p->data)<91) || ((p->data)>96 && (p->data)<123))
{
Insert(LA, i++, p->data);
}
else if ((p->data)>47 && (p->data)<58)
{
Insert(LB, j++, p->data);
}
else
{
Insert(LC, k++, p->data);
}
p = p->next;
}
}
int main()
{
PLinkList L;
PLinkList LA;
PLinkList LB;
PLinkList LC;
L = Create();
printf("输入的字符为:\n");
Showlist(L);
printf("\n");
LA = CreatNULL();
LB = CreatNULL();
LC = CreatNULL();
Match(L, LA, LB, LC);
printf("输出字母:\n");
Showlist(LA);
printf("\n");
printf("输出数字:\n");
Showlist(LB);
printf("\n");
printf("输出符号:\n");
Showlist(LC);
printf("\n");
Circular(LA);
Circular(LB);
Circular(LC);
}