建立专门的链表类处理有关动态链表的操作
来源:互联网 发布:郑州seo网络优化公司 编辑:程序博客网 时间:2024/06/06 14:02
呵呵 三个函数 insert cat 和 append貌似都导致程序崩溃了。。。
自我感觉:链表插入节点的关键是一头一尾的两个节点。。
注意下函数中的之前写错的cat函数。。
#include<iostream>using namespace std;class Student //结点类{public:Student(int n,double s){num=n;score=s;next=NULL;}~Student(){};Student *next; //指向下一个结点int num;double score;};class MyList //链表类{public:MyList(){head=NULL;}MyList(int n,double s); //以Student(n,s)作为单结点的链表~MyList();int display(); //输出链表,返回值为链表中的结点数void insert(int n,double s); //插入一系列结点:将Student(n,s)结点插入链表,该结点作为第一个结点void append(int n,double s); //追加:将Student(n,s)结点插入链表,该结点作为最后一个结点void cat(MyList &il); //将链表il连接到当前对象的后面int length(); //返回链表中的结点数private:Student *head; //链表的头结点};//以下为类成员函数的定义MyList::MyList(int n,double s){head=new Student(n,s);}MyList::~MyList(){while(head!=NULL){Student *p=head;head=head->next;delete p;}head=NULL;}int MyList::display(){int i=0;Student *head1=head;while(head1!=NULL){cout<<"num:"<<head1->num<<"\t"<<"score:"<<head1->score<<endl;head1=head1->next;++i;}head1=NULL;return i;}void MyList::insert (int n,double s)//熟练运用点的两种顺序插入{Student *pt=new Student(n,s);pt->next=head;head=pt;}void MyList::append(int n,double s)//关键点在于如何遍历到最后一点{Student *head2=head;if(head==NULL)head=new Student(n,s);else{while(head2->next!=NULL)head2=head2->next;head2->next=new Student(n,s);}//head2->next->num=n;//之前的错误写法,没有分配空间就赋值//head2->next->score=s;//head2->next->next=NULL;}//void MyList::cat(MyList &il)//错误在于将一个链表直接附加到另外的链表后,导致析构时附加的链表被析构两次//{ //在函数尾部将附加的链表头置为NULL,就不会出错// //但是这样貌似也不是很好//Student *pt=head;//while(pt->next!=NULL)pt=pt->next;//pt->next=il.head;//il.head=NULL;//}void MyList::cat(MyList& il){ Student *pt=il.head; while(pt) { append(pt->num,pt->score); pt=pt->next; }}int MyList::length(){int i=0;Student *head1=head;while(head1!=NULL){head1=head1->next;++i;}head1=NULL;return i;}//测试函数int main(){int n;double s;MyList head1;cout<<"input head1: "<<endl; //输入head1链表for(int i=0;i<2;i++){cin>>n>>s;head1.insert(n,s); //通过“插入”的方式}cout<<"head1: "<<endl; //输出head1head1.display();MyList head2(1001,98.4); //建立head2链表head2.append(1002,73.5); //通过“追加”的方式增加结点head2.append(1003,92.8);head2.append(1004,99.7);cout<<"head2: "<<endl; //输出head2head2.display();head2.cat(head1); //把head1追加到head2后面cout<<"length of head2 after cat: "<<head2.length()<<endl;cout<<"head2 after cat: "<<endl; //显示追加后的结果head2.display();return 0;}
直接写的cat函数,很复杂啊
void MyList::cat(MyList &il){if(NULL==head){head=new Student(il.head->num,il.head->score);Student *p2=head;Student *p3=il.head->next;while(p3!=NULL){p2->next=new Student(p3->num,p3->score);p2=p2->next;p3=p3->next;}}else{Student *pp2=head;while(pp2->next!=NULL)pp2=pp2->next;Student *pp3=il.head;while(pp3!=NULL){pp2->next=new Student(pp3->num,pp3->score);pp2=pp2->next;pp3=pp3->next;}}}
修改后:
void MyList::cat(MyList &il){ Student *p2,*p3;//p2指向最后一个有效点,p3指向要拷贝的第一个点if(NULL==head){head=new Student(il.head->num,il.head->score);p2=head;p3=il.head->next;}else{p2=head;while(p2->next!=NULL)p2=p2->next;p3=il.head;}while(p3!=NULL){p2->next=new Student(p3->num,p3->score);p2=p2->next;p3=p3->next;}}
0 0
- 第十四周实验--任务2--建立专门的链表类处理有关动态链表的操作
- C++第十四周【任务2】建立专门的链表类处理有关动态链表的操作
- 《第十四周任务二》建立专门的链表类处理有关动态链表的操作
- 建立专门的链表类处理有关动态链表的操作
- 建立专门的链表类处理有关动态链表的操作 扩展二
- 第十四周实验--任务2--建立专门的链表类处理有关动态链表的操作(升级版)
- 《C++第十四周实验报告2-1》---建立专门的链表类处理有关动态链表的操作
- 第14周任务2(建立专门的链表类处理有关动态链表的操作)
- 第十五周上机任务项目2-建立专门的链表类处理有关动态链表的操作
- 第十四周任务二(建立专门链表类处理有关动态链表)
- 第十四周实验--任务1--建立专门的数组类处理有关数组的操作
- 第十四周任务1建立专门的数组类处理有关数组的操作
- 第十四周 任务一 建立专门的数组类处理有关数组的操作
- C++第十四周【任务1】 建立专门的数组类处理有关数组的操作
- 第14周任务1(建立专门的数组类处理有关数组的操作)
- 《第十四周任务一》建立专门的数组类处理有关数组的操作
- 第十五周上机任务项目1-建立专门的数组类处理有关数组的操作
- 第十五周项目一 —— 建立专门的数组类处理有关数组的操作
- 中央网络安全和信息化领导小组成立
- 自认为比较好的一篇英语文章记录一下。
- 踏入oracle的菜鸟
- 出发
- Java多线程同步机制(synchronized)
- 建立专门的链表类处理有关动态链表的操作
- Java编程中“为了性能”需做的26件事
- 【论文笔记】Mid-level Visual Element Discovery as Discriminative Mode Seeking
- 2014寒假 生活
- 操作系统的基本功能
- 九度OJ 1086 最小花费
- Qt中关于 Char* to QString
- UTF-8页面引用外部编码为GBK的JS文件编码的处理
- JSTL标签split属性