《第十四周实验报告任务2》

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 文件名称: 《动态链表》
* 作 者: 刘江波
* 完成日期: 2012 年 5 月 24 日
* 版 本 号: v.5241

* 对任务及求解方法的描述部分
* 问题描述:

建立专门的链表类处理有关动态链表的操作
动态链表也是程序设计中的一种非常有用的数据结构。可以说,是否能够理解有关操作的原理,决定了你是否有资格称为“科班”出身。在C++程序设计中解决相关问题不免让人有些害怕,所幸在是,在后续的专业基础课中,相关的内容还会从不同的角度,反复地认识,反复地实践。不过,在现阶段多些体验,也是很有必要的了。
先阅读下面的程序,回顾一下动态链表,阅读程序过程中,请用笔画一画形成链表的过程中指针值的变化
* 程序头部的注释结束
*/

#include<iostream>   
#include<string>   
using namespace std;  
  
class Student  
{                            
public:  
    Student(int n,double s, string na, int a){num = n;score = s;name = na;age= a;next = NULL;}  
    Student *next;  
    int num;  
    double score;  
    string name;  
    int age;  
};  
  
class MyList  
{  
public:  
    MyList(){head = NULL;}  
    MyList(int n,double s, string na, int a){head = new Student(n, s, na, a);} //以Student(n,s)作为单结点的链表   
    int display();  //输出链表,返回值为链表中的结点数   
    void insert(int n,double s, string na, int a);  //插入:将Student(n,s)结点插入链表,该结点作为第一个结点   
    void append(int n,double s, string na, int a);  //追加:将Student(n,s)结点插入链表,该结点作为最后一个结点   
    void cat(MyList &il); //将链表il连接到当前对象的后面   
    int length();  //返回链表中的结点数   
private:  
    Student *head;  
};  
  
int MyList::display()  
{  
    Student *p = head;  
    int num = length();  
  
    cout << "num" << '\t' << "score" << '\t' << "name" <<  '\t' << "age" << endl;  
  
    for(int i = 1; i <= num; ++i)  
    {  
        cout << p->num << '\t' << p->score << '\t' << p->name << '\t' << p->age << endl;  
        p = p->next;  
    }  
    return length();  
}  

void MyList::append(int n, double s, string na, int a)  
{  
    if(head == NULL)  
    {  
        head = new Student(n, s, na, a);  
    }  
    else  
    {  
        Student *p = head;
		while(p->next !=NULL)
		{	
			p = p->next;  
		}
		p->next = new Student(n, s, na, a); 
    }  
}  
  
int MyList::length()  
{  
    int num = 0;  
  
    Student *p = head;  
  
    while(p != NULL)  
    {  
        num++;  
        p = p->next;  
    }  
  
    return num;  
}  
  
void MyList::cat(MyList &il)  
{  
    Student *p = head, *q;  
  
    while(p != NULL)  
    {  
        q = p;  
        p = p->next;  
    }  
  
    q->next = il.head;  
    il.head = NULL;  
}  
  
void MyList::insert(int n,double s, string na, int a)  
{  
    if(head == NULL)  
    {  
        head = new Student(n, s, na, a);  
        head->next = NULL;  
    }  
    else  
    {  
        Student *p = head, *q;  
  
        while(p != NULL)  
        {  
            q = p;  
            p = p->next;  
        }  
  
        q->next = new Student(n, s, na, a);  
        p = q->next;  
        p->next = NULL;  
    }  
}  
  
int main()  
{  
    int n;  
    double s;  
    string na;  
    int a;  
    MyList head1;  
  
    cout << "input head1: " << endl;  //输入head1链表   
  
    for(int i = 0; i < 3; i++)  
    {  
        cin >> n >> s >> na >> a;  
        head1.insert(n, s, na, a);  //通过“插入”的方式   
    }  
  
    cout << "head1: " << endl; //输出head1   
  
    head1.display();  
  
    MyList head2(1001, 98.4, "li", 22);  //建立head2链表   
    head2.append(1002, 73.5, "liu", 21);  //通过“追加”的方式增加结点   
    head2.append(1003, 92.8, "shi", 21);  
    head2.append(1004, 99.7, "jiang", 21);  
  
    cout << "head2: " << endl;   //输出head2   
  
    head2.display();  
  
    head2.cat(head1);   //反head1追加到head2后面   
  
    cout << "length of head2 after cat: " << head2.length() << endl;  
    cout << "head2 after cat: " << endl;   //显示追加后的结果   
  
    head2.display();  
  
    system("pause");  
    return 0;  
}  


总结:

只要将指针之间的关系搞明白,一切就简单了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值