数据结构链表
已知一单链表中的数据元素含三类字符(字母字符、数字字符和其他字符)试编写算法,构造三个循环链表,使每个循环链表只含一类字符,且利用原表中节点空间作为这三个表地节点空间(头节点可另外开辟)
框架
#include<stdio.h>
#include<malloc.h>
typedef char datatype;
typedef struct node
{ datatype data;
struct node *next;
}linklist;
linklist* create( );
void resolve(linklist*,linklist*,linklist*,linklist*);
void print1(linklist*);
void print2(linklist*);
int main(void)
{ linklist *head,*letter,*digit,*other;
head=create( );
printf("原链表为:\n");
print1(head);
letter=(linklist*)malloc(sizeof(linklist));//建立3个空循环链表
letter->next=letter;
digit=(linklist*)malloc(sizeof(linklist));
digit->next=digit;
other=(linklist*)malloc(sizeof(linklist));
other->next=other;
resolve(head, letter, digit, other);//调用分解单链表的函数
printf("分解后的字母链表为:\n");
print2(letter);//输出循环链表
printf("分解后的数字链表为:\n");
print2(digit);
printf("分解后的其它字符链表为:\n");
print2(other);
return 0;
}
实现
#include<stdio.h>
#include<malloc.h>
typedef char datatype;
typedef struct node
{
datatype data;
struct node*next;
} linklist;
linklist*createlist()//创建链表,输入字符,回车表示结束
{
linklist *head,*p,*r;
char ch;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
r=head;
printf("输入字符 回车结束\n");
while((ch=getchar())!='\n')
{
p=(linklist*)malloc(sizeof(linklist));
p->data=ch;
r->next=p;
r=p;
}
r->next=NULL;
return head;
}
void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other)
{
linklist*h,*l,*d,*o;
h=head->next,l=letter,d=digit,o=other;
while(h)
{
if((h->data>='a'&&h->data<='z')||(h->data>='A'&&h->data<='Z'))
{
l->next=h,l=l->next,h=h->next,l->next=letter;
}
else if(h->data>='0'&&h->data<='9')
{
d->next=h,d=d->next,h=h->next,d->next=digit;
}
else
{
o->next=h,o=o->next,h=h->next,o->next=other;
}
}
free(head);
}
void printlist1(linklist*head)
{
linklist*p=head;
while(p->next)
{
p=p->next;
printf("%c",p->data);
}
printf("\n");
}
void printlist2(linklist*head)
{
linklist*p=head;
while(p->next!=head)
{
p=p->next;
printf("%c",p->data);
}
printf("\n");
}
linklist*createlist();
void resolve(linklist*,linklist*,linklist*,linklist*);
void printlist1(linklist*head);
void printlist2(linklist*head);
int main()
{
linklist*head,*letter,*digit,*other;
head=createlist();
printf("原链表为: \n");
printlist1(head);
letter=(linklist*)malloc(sizeof(linklist));
letter->next=letter;
digit=(linklist*)malloc(sizeof(linklist));
digit->next=digit;
other=(linklist*)malloc(sizeof(linklist));
other->next=other;
resolve(head,letter,digit,other);
printf("分解后的字母链表为:\n");
printlist2(letter);
printf("分解后的数字链表为:\n");
printlist2(digit);
printf("分解后的其他字符为: \n");
printlist2(other);
return 0;
}
注意循环链表和单链表输出方式不一样