一笔画问题.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

List &Insert(const int &x); List &Delete(int &x); Node *first; }; const int List::Length() //长度函数的外部定义 { Node *current=first; int len=0; while(current) { len++; current=current->next; } return len; } List &List::Insert(const int &x) { Node *h=new Node; //为结点h分配一个动态存储空间 h->data=x; h->next=first; //在表头插入新结点 first=h; return *this; //返回指向h的指针
} List &List::Delete(int &x) { Node *current=first,*k=0; while( current && current->data!=x) //寻找元素x的指针 { k=current; current=current->next; } if(!current) { cout<<'-1'<<endl; sign=0; //开关变量 } x=current->data; if(k) k->next=current->next; //删除结点 else first=current->next; delete current; //释放空间 return *this;
输入文件示例
7 10 1 1 1 1 2 3 3 4 5 5 2 3 6 7 3 4 5 5 6 7
输出文件示例
17543561321
我的程序代码如下: #include <iostream.h> #include <fstream.h> #include<iomanip.h> int sign=1; //全局变量的定义 class List; class Node //链表结点的定义 { public: int data; Node *next; }; class List { friend class List; //友元函数的声明 public: List() {first=0;} //构造函数的定义 const bool Empty() {return first==0? 1:0;} //测试表是否 为空 const int Length(); //计算表的长度的函数 List &Insert(const int &x);
一笔画问题
报告人:陈颖 计〈4〉 030402504
问题描述:
对于给定的平面上的n个点和连接这n个点的m 条边,每条边连接2个点。 一笔画问题:找出给定的m条边的一条首尾相接的 回路,使得从任何给定出发点沿此回路可以经过m 条边恰好1次又回到出发点。
编程任务:
对于给定的n个点和连接这n个点的m条边,编 程计算一笔画回路。
} int main() { ifstream in("input.txt"); ofstream out("output.txt"); int n,m,v,w,IND=0,s; //n为顶点数,m为连线总数 in>>n>>m; if(m<n) //无意义 { out<<"-1\n"; } int *p=new int[m+1]; //为指针p分配含10个整型的动态存储 单元 List *list=new List[n+1]; //分配n+1个表的动态空间且list指针指 向它的首地址 for(int i=0;i<m;i++) //建立两结点的关联 { in>>v>>w; //输入结点的值即图的顶点 list[v].Insert(w); //在含v的链表后插入w
数据输入:
Baidu Nhomakorabea
由文件input.txt给出输入数据,第一行有2个 正整数n和m,表示给定n个点和连接这n个点的m 条边,点编号为1,2,3,…,n,接下来的m行中 , 每行有2个正整数u,v,表示连接点u和v的一条边。
结果输出:
将编程计算出的一笔画回路输出到文件 output.txt.
如不存在一笔画问题,则输出-1
list[w].Insert(v); //同上 } s=list[1].first->data; //把链表一的表首的值赋给s i=1; p[IND++]=1; // 从顶点1开始出发,i=1 while(sign && IND<=m) // sign 无意义,没有改变过 { p[IND++]=s; list[i].Delete(s); // 删除操作,解除连接 list[s].Delete(i); i=s; //释放掉前一结点的空间后,把当前结点作为 下一结点的前一结点 if(!list[i].Empty()) //链表i为非空,有与i相连的点 s=list[i].first->data; } if(p[m-1]==1 || p[m]!=1) //判段是否找到回路 out<<'-1'<<endl; else {
for(i=0;i<=m;i++)
//输出该回路 out<<p[i]<<' '; out<<'\n';
} return 1; }
以上就是我的程序代码,其实我的程序有些 错误,因为我的思路是:如果一个图存在欧 拉回路的话,那不管从哪个顶点开始,从哪条 边开始都可以找得到一条欧拉回路” 来做题 (这是错的)。当输入的数据不符合时候就 会出错。所以还有待改进。
相关文档
最新文档