C++ OJ习题练习(二十一)设计整型链表类List

Problem Description

设计一个整型链表类List,能够实现链表节点的插入(insert)、删除(delete),以及链表数据的输出操作(print)。

提示:链表结点用如下结构定义:
struct Node{//结点的结构
int data;
Node *next;
};

链表类List有一个数据成员head,类型是Node *

根据题目要求完善下面的程序:

#include
using namespace std;

struct Node{//结点的结构
    int data;
    Node *next;
};

class List{
private:
    Node* head;
public:

//你的代码将被嵌在这里
int main()
{
    List list;//定义一个空链表list
    list.Listinsert(0,10);//在第0个结点的后面插入值为10的新结点,也即在链表头部插入新的结点
    list.Listinsert(0,66);
    list.Listinsert(1,292);//在第1个结点的后面插入值为10的新结点
    list.Listdelete(66);//删除链表中第一个值为66的结点
    list.Listinsert(2,-2);//在第2个结点的后面插入值为-2的新结点
    list.Listinsert(1,3);//在第1个结点的后面插入值为3的新结点
    list.Listprint();//从头到尾输出链表结点的值,每个输出值占一行
    return 0;
}

Sample Input

Lili fjs 90

Sample Output

292
3
10
-2

解题代码

 	// 构造函数
	List()
    {
        head = NULL;
    }
	// 析构函数
    ~List()
    {
        delete head;
    }
	// 插入方法
    void Listinsert(int i,int value)
    {
        int index = 0;
        // 创建一个节点 
        Node *n = new Node();
        // 组装数据
        n->data = value;
        n->next = NULL;
        
        if(index == i)
        {
            // 如果头节点不为空就头节点替换为插入节点
            if(head != NULL)
            {
              // 将插入节点的下一个节点指向头节点
              n->next = head;
              // 将头节点指向插入节点
              head = n;
            }
            // 如果头节点为空就将头节点指向插入节点
            else
            {
                head = n;
            }
        }
        // 如果不是从头节点插入
        else
        {
            // p用于遍历 q记录前一个节点
            Node *p=NULL,*q=NULL;
            // p指向头节点
            p = head;
            // 遍历查找插入的位置
            while (index != i && p != NULL){q = p;index++; p = p->next;}
            // 找到后将前一个节点的后一个节点指向插入的节点
            q->next = n;
            // 将插入的节点的后一个节点指向当前节点
            n->next = p;
        }
    }
	// 根据值删除节点
    void Listdelete(int value)
    {
        // q用于遍历 p记录前一个节点
        Node *q,*p;
        q = p = NULL;
        // 如果要删除的节点是头节点
        if (head-> data == value)
        {
            // q指向头节点
            q = head;
            // 将头节点指向原来头节点的下一个节点
            head = head->next;
            // 释放原有的头节点的空间
            delete q;
        }else
        // 如果删除的不是头节点
        {
            q = p = head;
     		// 遍历找到要删除的节点
            while(q)
            {
                // p记录前一个节点
                p = q;
                // 找到后退出循环
                if(q->data == value) break;
                q = q->next;
            }
            // 如果q不为空 代表找到了
            if(q != NULL)
            {
                // 将要删除的节点的前一个节点指向要删除节点的下一个节点
                p->next = q->next;
                // 释放掉要删除的节点
                delete q;
            }
            // 找不到 就打印相关信息
            else
            {
                cout << "not found data : " << value<<endl;
            }
        }
    }
	// 打印链表值
    void Listprint()
    {
        Node *q = NULL;
        q = head;
     	// 遍历打印
        while(q != NULL){cout << q->data << endl;q=q->next;}
        // 换行
        cout <<"---------"<<endl;
    }
};

你可能感兴趣的:(C/C++,c++,链表,oj系统)