单链表中信息的分类,为什么我的代码没有输出

题目描述
已知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;
}