题目描述
已知L为设有头结点的单链表中第一个结点的指针,每个结点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其他字符。编写程序构造三个以带头结点的单循环链表表示的线性表,使每个表中只含同一类字符,最后输出链表中的信息。
输入
链表中的数据元素;
输出
第一行为数字链表中的信息; 第二行为英文字母字符链表中的信息; 第三行为其它字符链表中的信息。
样例输入
abc123@$12
样例输出
12312
abc
@$
#include<stdlib.h>
#include<stdio.h>
typedef struct LinkNode
{
char data;
struct LinkNode *next;
}LinkNode;
void InitList(LinkNode *&L)
{
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=L;
}
void CreatList(LinkNode *&L,char a[],int n)
{
LinkNode *s,*r=L;
for(int i=0;i<n;i++)
{
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
//尾插法
void Sort(LinkNode *&L,LinkNode *&L1,LinkNode *&L2,LinkNode *&L3)
{
LinkNode *p=L->next,*r1=L1,*r2=L2,*r3=L3,*s1,*s2,*s3;
while(p!=NULL)
{
if(p->data>='0'&&p->data<='9')
{
s1=(LinkNode*)malloc(sizeof(LinkNode));//为什么这里有malloc
s1->data=p->data;//为什么多此一举弄s
s1->next=r1->next;
r1->next=s1;
r1=s1;
}
else if((p->data>='a'&&p->data<='z')||(p->data>='A'&&p->data<='Z'))
{
s2=(LinkNode*)malloc(sizeof(LinkNode));
s2->data=p->data;
s2->next=r2->next;
r2->next=s2;
r2=s2;
}
else
{
s3=(LinkNode*)malloc(sizeof(LinkNode));
p->next=r3->next;
r3->next=p;
r3=p;
}
p=p->next;
}
}
void DisList(LinkNode *&L)
{
LinkNode *p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
}
int main()
{
int i;
LinkNode *L,*L1,*L2,*L3;
InitList(L);
InitList(L1);
InitList(L2);
InitList(L3);
char a[i];
int n;
for(int i=0;;i++)
{
scanf("%d",&a[i]);
if(a[i]=='\n') break;
}
CreatList(L,a,n);
Sort(L,L1,L2,L3);
DisList(L1);
printf("\n");
DisList(L2);
printf("\n");
DisList(L3);
return 0;
}
首先 InitList 函数里面的l next应该初始化为null
其次sort函数里面的else里面的代码也没有写对,再认真想想,else里面等等代码跟上面s1和s2一样的,这两个比较主要,当然输入输出函数里面的%d应该改成%c啦。哇,问题还挺多的,char a[i]这个定义是不对的,编译一下就明白了,还有输入完之后n的值还没初始化啊,要让它等于字符的个数呢。
修改如下,供参考:
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef struct LinkNode
{
char data;
struct LinkNode* next;
}LinkNode;
void InitList(LinkNode*& L)
{
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL; //L->next = L;
}
void CreatList(LinkNode*& L, char a[], int n)
{
LinkNode* s, * r = L;
for (int i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
//尾插法
void Sort(LinkNode*& L, LinkNode*& L1, LinkNode*& L2, LinkNode*& L3)
{
LinkNode* p = L->next, * r1 = L1, * r2 = L2, * r3 = L3, * s1;// *s2, * s3;
while (p != NULL)
{
s1 = (LinkNode*)malloc(sizeof(LinkNode));//为什么这里有malloc
s1->next = NULL;
s1->data = p->data;//为什么多此一举弄s
if (p->data >= '0' && p->data <= '9')
{
//s1 = (LinkNode*)malloc(sizeof(LinkNode));//为什么这里有malloc
//s1->next = NULL;
//s1->data = p->data;//为什么多此一举弄s
//s1->next = r1->next;
r1->next = s1;
r1 = s1;
}
else if ((p->data >= 'a' && p->data <= 'z') || (p->data >= 'A' && p->data <= 'Z'))
{
//s2 = (LinkNode*)malloc(sizeof(LinkNode));
//s2->data = p->data;
//s2->next = r2->next;
r2->next = s1;
r2 = s1;
}
else
{
//s3 = (LinkNode*)malloc(sizeof(LinkNode));
//p->next = r3->next;
r3->next = s1;//p;
r3 = s1;
}
p = p->next;
}
}
void DisList(LinkNode*& L)
{
LinkNode* p = L->next;
while (p != NULL)
{
printf("%c", p->data); //printf("%d", p->data);
p = p->next;
}
}
int main()
{
int i;
LinkNode* L, * L1, * L2, * L3;
InitList(L);
InitList(L1);
InitList(L2);
InitList(L3);
char a[256] = {0};//char a[i];
//int n;
for (i = 0; ; i++)
{
scanf("%c", &a[i]); //scanf("%d", &a[i]);
if (a[i] == '\n') break;
}
CreatList(L, a, i); //CreatList(L, a, n);
DisList(L);
printf("\n");
Sort(L, L1, L2, L3);
DisList(L1);
printf("\n");
DisList(L2);
printf("\n");
DisList(L3);
return 0;
}
#include<stdlib.h>
#include<stdio.h>
typedef struct LinkNode
{
char data;
struct LinkNode *next;
}LinkNode;
LinkNode * InitList()
{
LinkNode *L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
return L ;
}
LinkNode * inser(LinkNode *L,LinkNode *last, char ch)
{
LinkNode * node = (LinkNode*)malloc(sizeof(LinkNode));
node->data=ch;
if(!last)
{
node->next=node;//s->next=NULL;单链表 s->next=s;循环单链表
L->next=last=node ;//插入第一个节点时,头节点指针域要赋值
}
else
{
node->next=L->next;//node->next=last->next; 循环单链表指向第一个节点 s->next=NULL;单链表指向NULL
last->next=node;
last=node;
}
return last ;
}
void Sort(LinkNode *L,LinkNode *L1,LinkNode *L2,LinkNode *L3)
{
LinkNode *p=L->next,*end =L->next, *last1=NULL,*last2=NULL,*last3=NULL;
char ch ;
if(!p)return ;
while(1)
{
ch=p->data ;
if(ch>='0'&&ch<='9')
{
last1=inser(L1,last1,ch) ;
}
else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
last2=inser(L2,last2,ch) ;
}
else
{
last3=inser(L3,last3,ch) ;
}
p=p->next;
if( p==end )break ;//循环单链表尾节点指向第一个节点
}
}
void DisList(LinkNode *L)//不需要改变L的值,没必要传音用
{
LinkNode *p=L->next ,*end=L->next;
if(!p)return ;
while(1)
{
printf("%c",p->data);//输出字符用%c格式符
p=p->next;
if( p==end )break ;//循环单链表尾节点指向第一个节点
}
}
int main()
{
LinkNode *L=InitList();
LinkNode *L1=InitList();
LinkNode *L2=InitList();
LinkNode *L3=InitList();
LinkNode *last =NULL ;
while(1)
{
char ch ;
int n;
n=scanf("%c",&ch);
if(n==0 || ch=='\n' || ch=='\r'|| ch==EOF) break;
last=inser(L ,last ,ch);
}
Sort(L,L1,L2,L3);
DisList(L1);
printf("\n");
DisList(L2);
printf("\n");
DisList(L3);
return 0;
}