建立专门的链表类处理有关动态链表的操作

来源:互联网 发布:郑州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