回 帖 发 新 帖 刷新版面

主题:请教链表小程序

单链表中每个结点存放一个字符,设计一个算法,将该单链表按字母、数字和其他字符拆成三个单循环链表(利用原有结点)

回复列表 (共10个回复)

沙发

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct nosense
{
    char c;
    struct nosense *next;
} T;
void append(T **head, T** rear, T** data)
{
    if((*rear)==NULL)  (*rear)=(*head)=(*data);
    else {
        (*rear)->next=(*data);
        (*rear)= (*rear)->next;        
    }
    (*data)=(*data)->next;
    (*rear)->next=NULL;
}
void split(T *orgin, T **ch, T **nu, T **oth)
{
    if(NULL==orgin) return;
    T *p=orgin, *pch=NULL, *pnu=NULL, *poth=NULL;
    while(p!=NULL){
          if(p->c>='0' && p->c<='9') append(ch, &pch, &p);
          else if( (p->c>='a' && p->c<='z') || (p->c>='A' && p->c<='Z')) append(nu, &pnu, &p);
          else append(oth, &poth, &p);
    }
}
void init(T** l)
{
    freopen("input.txt", "r", stdin);
    char c;
    T *prear;
    while(scanf("%c", &c)!=EOF)
    {
        if((*l)==NULL) (*l)=prear=(T*)malloc(sizeof(T));
        else {
            prear->next=(T*)malloc(sizeof(T));
            prear=prear->next;
        }
        prear->c=c;
        prear->next=NULL;
    }
}
void output(T *l)
{
    T *p=l;
    while(p!=NULL) {
        printf("%c->", p->c);
        p=p->next;
    }
    printf("\n");
}
int main()

T *list=NULL, *c, *n, *o;
init(&list);
output(list);
split(list, &c, &n, &o);
output(c);
output(n);
output(o);
return 0;
}

这个应该可以完成你的目标,自己编写一个input.txt文件测试一下。

板凳

谢谢neulinux
不过你的程序还是借助了其它空间
题目要求利用原有结点的

3 楼

你还是仔细看看我的代码在评论吧!所谓额外空间的概念是什么?
程序中唯一使用了malloc的地方是给你创建链表用,提供给你测试的函数看来也是罪过啊!

如果还是觉得自己是对的,你不妨找justforfun626来给看看好了!

4 楼

不好意思,仔细看了一下,的确没有利用多余的空间!!

5 楼

返照的写了一个C++程序,不知道问题出在哪?
/**单链表中每个结点存放一个字符,设计一个算法,将该单链表按字母、数字和其他字符拆成三个单循环链表(利用原有结点)**/
#include "iostream"
using namespace std;
template <class T>
struct Node
{
    Node(const T& e=T(),Node<T>* next=NULL):element(e),link(next){}
    T element;
    Node<T>* link;
     
};
template <class T>
void append(Node<T>** head,Node<T>** rear,Node<T>** temp)
{

    if((*head)->link==NULL)
    {
    (*rear)=(*temp);
    (*head)->link=(*rear);
    (*rear)->link=NULL;
    }
    else
    {
    (*rear)->link=*temp;
    (*rear)=(*temp);
    (*temp)=(*temp)->link;
    }
    
}
template <class T>
void split(Node<T>** head,Node<T>** h1,Node<T>** h2,Node<T>** h3)
{
Node<T>* temp;
temp=(*head)->link;
Node<T>* rear1=NULL;
Node<T>* rear2=NULL;
Node<T>* rear3=NULL;
while(temp!=NULL)
{
if(('0'<=temp->element)&&(temp->element<='57'))
{
cout<<"in char";
append(h1,&rear1,&temp);
cout<<temp->element<<endl;
}
else if(('a'<=temp->element)&&(temp->element<='z')||('A'<=temp->element)&&(temp->element<='Z'))
{
append(h2,&rear2,&temp);
cout<<temp->element<<endl;
}
else
{
append(h3,&rear3,&temp);
cout<<temp->element<<endl;
}
}
}
template <class T>
void printList(Node<T>* head)
{
Node<T>* temp;
for(temp=head->link;temp!=NULL;temp=temp->link)
{
    cout<<temp->element<<',';
}
cout<<endl;
}

Node<char>* createList()
{
    Node<char>* r;
    Node<char>* p;
    Node<char>* head=new Node<char>('0',NULL);
    char c;
    char e;
    cout<<"input? y/n"<<endl;
    while((c=getchar())=='\n');
    while(tolower(c)!='n')
    {
              cin>>e;
              p=new Node<char>(e,NULL);
              if(head->link==NULL)
                  head->link=p;
              else
                  r->link=p;
              r=p;
         cout<<"input? y/n"<<endl;
        while((c=getchar())=='\n');
    }
    cout<<"out"<<endl;
    return head;
}
void main()
{
Node<char>* head=createList();
printList(head);
Node<char>* h1;
Node<char>* h2;
Node<char>* h3;
h1=new Node<char>('0',NULL);
h2=new Node<char>('0',NULL);
h3=new Node<char>('0',NULL);
split(&head,&h1,&h2,&h3);
printList(h1);
printList(h2);
printList(h3);
}

6 楼

你怎么可以贴这样的程序出来呢?
首先,你的主函数至少是符合C99规范的吧!给你看代码的人可能使用其他编译器,所以在这种小问题上应该尽量注意,而且这对你的代码风格也有好处,如果你也是从业人员的话。
其次,想请问你下面的语句是怎么通过编译的!!!!!
if(('0'<=temp->element)&&(temp->element<='57'))
我知道你想说的是if(('0'<=temp->element)&&(temp->element<='9'))或者if((48<=temp->element)&&(temp->element<=57))
但即便是这样,你也不能贴自己都没有检查过的代码给其他人检查吧!
最后,综上所述你真的是很不负责任啊!

7 楼

我这个程序也调试1个小时了,但是就没有注意到一些细节问题.可能是长期以来形成的习惯吧!对于程序的认真程度不够!上面的这个程序编译是通过的,只是运行的时候结果出错,所以你指出的不是主要问题
所在!不过多谢批评,的确是自己不够负责任!这个习惯也不是很容易该,有时候一个小问题明明很明显的,自己就是看不到,你没有这种情况出现吗?如果没有,那只能说这是我的能力所限制了.希望自己以后能认真过来!
在看了你的批评后,又认真看了一下程序,终于调试对了.所以总结来说,还是受人指点一下好!
再次谢谢neulinux

/**单链表中每个结点存放一个字符,设计一个算法,将该单链表按字母、数字和其他字符拆成三个单循环链表(利用原有结点)**/
#include "iostream"
using namespace std;
template <class T>
struct Node
{
    Node(const T& e=T(),Node<T>* next=NULL):element(e),link(next){}
    T element;
    Node<T>* link;
     
};
template <class T>
void append(Node<T>** head,Node<T>** rear,Node<T>** temp)
{
    if((*head)->link==NULL)
    {
    (*rear)=(*temp);
    (*head)->link=(*rear);
    }
    else
    {
    (*rear)->link=*temp;
    (*rear)=(*temp);
    }
    (*temp)=(*temp)->link;
    (*rear)->link=NULL;    
}
template <class T>
void split(Node<T>** head,Node<T>** h1,Node<T>** h2,Node<T>** h3)
{
Node<T>* temp;
temp=(*head)->link;
Node<T>* rear1=NULL;
Node<T>* rear2=NULL;
Node<T>* rear3=NULL;
while(temp!=NULL)
{
if(('0'<=temp->element)&&(temp->element<='9'))
{
append(h1,&rear1,&temp);
}
else if(('a'<=temp->element)&&(temp->element<='z')||('A'<=temp->element)&&(temp->element<='Z'))
{
append(h2,&rear2,&temp);
}
else
{
append(h3,&rear3,&temp);
}
}
}
template <class T>
void printList(Node<T>* head)
{
Node<T>* temp;
for(temp=head->link;temp!=NULL;temp=temp->link)
{
    cout<<temp->element<<',';
}
cout<<endl;
}

Node<char>* createList()
{
    Node<char>* r;
    Node<char>* p;
    Node<char>* head=new Node<char>('0',NULL);
    char c;
    char e;
    cout<<"input? y/n"<<endl;
    while((c=getchar())=='\n');
    while(tolower(c)!='n')
    {
              cin>>e;
              p=new Node<char>(e,NULL);
              if(head->link==NULL)
                  head->link=p;
              else
                  r->link=p;
              r=p;
         cout<<"input? y/n"<<endl;
        while((c=getchar())=='\n');
    }
    return head;
}
int main()
{
Node<char>* head=createList();
printList(head);
Node<char>* h1;
Node<char>* h2;
Node<char>* h3;
h1=new Node<char>('0',NULL);
h2=new Node<char>('0',NULL);
h3=new Node<char>('0',NULL);
split(&head,&h1,&h2,&h3);
printList(h1);
printList(h2);
printList(h3);
return 0;
}



8 楼

你能通过自己的努力,运用必要手段解决问题,这是很值得高兴的事情。这也是我回复你帖子,还提出了批评意见的目的。你问我是否犯过类似错误,我可以很确定的告诉你——有,但是,这类问题完全可以通过debug这样的工具检测出来啊!当你编好一个小程序的时候,同时你也由一个RD的角色转换为了一个QA,这点觉悟是要有的。一个程序员可能一生都没有什么作为,但是能够通过不懈努力减少自己作品的bug,不也是力所能及的作为吗?
既然你能解决问题,就说明你的能力没有问题,问题在于你浮躁的心。“软件是一种态度”我的导师曾经跟我这样说过,我今天也把这句话送给你。希望你能再接再厉!

9 楼

恩,浮躁的心!!谢谢鼓励!!以后还望neulinux能多多指教!

10 楼

#include <iostream>

貌似""通不过吧 除非你自己写的

我来回复

您尚未登录,请登录后再回复。点此登录或注册