主题:请教链表小程序
linfengfeiye
[专家分:320] 发布于 2008-03-14 10:51:00
单链表中每个结点存放一个字符,设计一个算法,将该单链表按字母、数字和其他字符拆成三个单循环链表(利用原有结点)
回复列表 (共10个回复)
沙发
neulinux [专家分:420] 发布于 2008-03-14 16:06:00
#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文件测试一下。
板凳
linfengfeiye [专家分:320] 发布于 2008-03-14 16:22:00
谢谢neulinux
不过你的程序还是借助了其它空间
题目要求利用原有结点的
3 楼
neulinux [专家分:420] 发布于 2008-03-14 16:34:00
你还是仔细看看我的代码在评论吧!所谓额外空间的概念是什么?
程序中唯一使用了malloc的地方是给你创建链表用,提供给你测试的函数看来也是罪过啊!
如果还是觉得自己是对的,你不妨找justforfun626来给看看好了!
4 楼
linfengfeiye [专家分:320] 发布于 2008-03-15 22:09:00
不好意思,仔细看了一下,的确没有利用多余的空间!!
5 楼
linfengfeiye [专家分:320] 发布于 2008-03-16 11:22:00
返照的写了一个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 楼
neulinux [专家分:420] 发布于 2008-03-16 22:21:00
你怎么可以贴这样的程序出来呢?
首先,你的主函数至少是符合C99规范的吧!给你看代码的人可能使用其他编译器,所以在这种小问题上应该尽量注意,而且这对你的代码风格也有好处,如果你也是从业人员的话。
其次,想请问你下面的语句是怎么通过编译的!!!!!
if(('0'<=temp->element)&&(temp->element<='57'))
我知道你想说的是if(('0'<=temp->element)&&(temp->element<='9'))或者if((48<=temp->element)&&(temp->element<=57))
但即便是这样,你也不能贴自己都没有检查过的代码给其他人检查吧!
最后,综上所述你真的是很不负责任啊!
7 楼
linfengfeiye [专家分:320] 发布于 2008-03-17 10:14:00
我这个程序也调试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 楼
neulinux [专家分:420] 发布于 2008-03-17 11:46:00
你能通过自己的努力,运用必要手段解决问题,这是很值得高兴的事情。这也是我回复你帖子,还提出了批评意见的目的。你问我是否犯过类似错误,我可以很确定的告诉你——有,但是,这类问题完全可以通过debug这样的工具检测出来啊!当你编好一个小程序的时候,同时你也由一个RD的角色转换为了一个QA,这点觉悟是要有的。一个程序员可能一生都没有什么作为,但是能够通过不懈努力减少自己作品的bug,不也是力所能及的作为吗?
既然你能解决问题,就说明你的能力没有问题,问题在于你浮躁的心。“软件是一种态度”我的导师曾经跟我这样说过,我今天也把这句话送给你。希望你能再接再厉!
9 楼
linfengfeiye [专家分:320] 发布于 2008-03-17 15:46:00
恩,浮躁的心!!谢谢鼓励!!以后还望neulinux能多多指教!
10 楼
vanehu [专家分:80] 发布于 2008-03-25 21:17:00
#include <iostream>
貌似""通不过吧 除非你自己写的
我来回复