zoukankan      html  css  js  c++  java
  • 创建双向链表类,实现添加、修改排序等操作

    题目描述:
    创建双向链表类,该类有默认构造函数、类的拷贝函数、类的析构函数、实现链表添加数据、升序排序、查找链表中某个节点及删除链表中某个节点的操作(禁用STL及String类))。

    “dLinkList.h”

    #pragma once
    #ifndef _DLINKLIST_H
    #define _DLINKLIST_H
    
    //节点
    typedef struct node {
    	int data;
    	node *next = nullptr;              //后驱指针
    	node *prev = nullptr;              //前驱指针
    }node;
    
    //双向链表
    class DuLinkList {
    public:
    	DuLinkList();                           //默认构造函数
    	DuLinkList(const DuLinkList & obj);     //拷贝构造函数
    	~DuLinkList();                          //析构函数
    	void headAdd(int temp);                 //头插法
    	void ptrAdd(int temp);			        //尾插法
    	void arbAdd(int tem, int temp);			//在任意位置插入数据
    	void LinkSort();				        //升序排序
    	void LinkSearch(int tem);               //查找节点
    	void LinkDelete(int tem);               //删除节点
    	void ShowLinkList();			        //输出链表
    private:
    	int len;//链表长度
    	node *head;//指向头节点的指针
    	node *ptr;//指向尾节点的指针
    };
    #endif // !_DLINKLIST_H
    
    

    "dLinkList.cpp"

    #include"pch.h"
    #include"dLinkList.h"
    #include<iostream>
    
    //默认构造函数
    DuLinkList::DuLinkList() {
    	head = new node();        //创建头节点
    	ptr = new node();		  //创建尾节点
    	head->prev = NULL;        //头节点的前驱为空
    	ptr->next = NULL;         //为节点的后驱为空
    	head->next = ptr;         //头节点指向尾节点
    	ptr->prev = head;         //尾节点指向头结点
    	len = 0;				  //链表初始化长度为0
    }
    
    //拷贝构造函数
    DuLinkList::DuLinkList(const DuLinkList & obj):head(NULL),ptr(NULL),len(0) {
    
    		head = new node(); //创建节点
    		while (obj.head->next != NULL) {
    			head->next = new node();
    			head->next->data = obj.head->data;
    			obj.head->next = obj.head->next;
    			len++;
    		}
    }
    
    //析构函数
    DuLinkList::~DuLinkList() {
    	node *phead1 = head;
    	node *phead2 = head;
    	while (phead1) {
    		phead1 = phead1->next;
    		delete phead1;
    		phead2 = phead1;
    	}
    	head = NULL;
    	ptr = NULL;
    	len = 0;
    }
    
    //头插法
    void DuLinkList::headAdd(int temp) {
    	node *phead = new node();		//新节点
    	phead->data = temp;
    	phead->prev = head;					//新节点前驱指向头节点
    	phead->next = head->next;			//后驱指向原头节点后的节点
    	head->next = phead;					//头节点指向新节点
    	len++;
    }
    
    //尾插法
    void DuLinkList::ptrAdd(int temp) {
    	node *phead = new node();//新节点
    	phead->data = temp;
    	phead->prev = ptr->prev;
    	phead->next = ptr;
    	ptr->prev->next = phead;
    	ptr->prev = phead;
    	len++;
    }
    
    //在中间任意位置插入
    void DuLinkList::arbAdd(int tem, int temp) {
    	node *phead1 = head;
    	for (int i = 0;i < tem-1;i++)
    		phead1 = phead1->next;         //找到第tem-1个节点
    	
    	node *phead2 = head;
    	for (int i = 0;i < tem;i++)
    		phead2 = phead2->next;         //找到第tem个节点
    	
    	node *phead = new node();          //创建新节点
    	phead->data = temp;					//节点数据赋值
    	phead->prev=phead1;					
    	phead->next=phead2;
    	phead1->next=phead;
    	phead2->prev=phead;
    	len++;
    }
    
    
    //升序排序
    void DuLinkList::LinkSort() {
    	node *phead1 = new node();
    	node *phead2 = new node();
    	int t;
    	for (phead1 = head->next;phead1->next!= ptr->next;phead1 = phead1->next) {
    		for (phead2 = phead1->next;phead2->next!= ptr->next;phead2 = phead2->next) {
    			if (phead1->data > phead2->data) {
    				t = phead1->data;
    				phead1->data = phead2->data;
    				phead2->data = t;
    			}
    		}
    	}
    }
    
    //查找节点
    void DuLinkList::LinkSearch(int tem) {
    	node *phead = head;
    	for (int i = 0;i < tem;i++)
    		phead = phead->next;
    	std::cout << "已找到第" << tem << "个节点,该节点中的数据是:" << phead->data << std::endl;
    }
    
    //删除节点
    void DuLinkList::LinkDelete(int temp) {
    	if (temp > len) {
    		std::cout << "temp大于链表的长度" << std::endl;
    	}
    	else {
    		node *phead1 = head;
    		node *phead2 = head->next;
    		for (int i = 1;i < temp;i++) {
    			phead1 = phead1->next;
    			phead2 = phead2->next;
    		}
    		phead1->next = phead2->next;
    		phead2->next->prev = phead1;
    		delete phead2;
    	}
    }
    
    //输出节点
    void DuLinkList::ShowLinkList() {
    	node *phead;
    	phead = head->next;
    	if (phead == NULL) {
    	std::cout << "链表为空" << std::endl;
    	}
    	else {
    		while (phead->next != ptr->next) {
    			std::cout << phead->data << " ";
    			phead=phead->next;
    		}
    		std::cout<<std::endl;
    	}
    }
    

    "main.cpp"

    
    #include "pch.h"
    #include <iostream>
    #include"dLinkList.h"
    #include<time.h>
    #include<stdlib.h>
    
    int main()
    {
    	DuLinkList link;
    
    	//头插法
    	link.headAdd(5);
    	link.headAdd(6);
    	link.headAdd(10);
    	link.headAdd(18);
    	link.headAdd(9);
    	link.headAdd(11);
    	link.headAdd(7);
    	link.headAdd(3);
    	std::cout << "头插法后的链表:" << std::endl;
    	link.ShowLinkList();
    	std::cout << std::endl;
    
    	std::cout << "升序排序后的链表:" << std::endl;
    	link.LinkSort();
    	link.ShowLinkList();
    	std::cout << std::endl;
    
    	std::cout << "查找链表第二个节点:" << std::endl;
    	link.LinkSearch(2);
    	std::cout << std::endl;
    
    	link.LinkDelete(2);
    	std::cout << "删除第二个节点后的链表:" << std::endl;
    	link.ShowLinkList();
    	std::cout << std::endl;
    
    	std::cout << "将新数据5添加到链表的第二个节点:"<<std::endl;
    	link.arbAdd(2, 5);
    	link.ShowLinkList();
    }
    
    

    运行结果:

  • 相关阅读:
    对Item中定时器的理解
    ClassLoader类加载机制&&JVM内存管理
    基于Quartz实现简单的定时发送邮件
    基于NIO的Socket通信
    1、svn架设、基本命令
    sysbench基准测试(2)——oltp.lua测试
    sysbench基准测试工具使用
    1、linux软件包管理
    7、数据结构五:sorted sets
    6、数据类型四:sets
  • 原文地址:https://www.cnblogs.com/izzwhf/p/10707229.html
Copyright © 2011-2022 走看看