zoukankan      html  css  js  c++  java
  • 【C++/数据结构】单链表的基本操作

    #pragma once
    #ifndef _CLIST_H_
    #define _CLIST_H_
    
    #include <iostream>
    #include <assert.h>
    using namespace std;
    
    template<class Type> class List;
    
    typedef enum { FALSE, TRUE }Status;
    
    template<class Type>
    class ListNode
    {
    	friend class List<Type>;
    public:
    	ListNode() :data(Type()), next(NULL)
    	{}
    	ListNode(Type d, ListNode<Type> *n = NULL)
    		: data(d), next(n)
    	{}
    	~ListNode()
    	{}
    	void setData(const Type &d)
    	{
    		data = d;
    	}
    	Type GetData()
    	{
    		return data;
    	}
    private:
    	Type data;
    	ListNode<Type> *next;
    };
    
    template<class Type>
    class List
    {
    public:
    	List()
    	{
    		ListNode<Type> *s = new ListNode<Type>(0);
    		assert(s != NULL);
    		last = first = s;
    		size = 0;
    	}
    	~List()
    	{}
    public:
    	Status push_back(const Type &x)
    	{
    		ListNode<Type> *s = new ListNode<Type>(x);
    		last->next = s;
    		last = s;
    		size++;
    		return TRUE;
    	}
    	Status push_front(const Type &x)
    	{
    		ListNode<Type> *s = new ListNode<Type>(x);
    		s->next = first->next;
    		first->next = s;
    		if (size == 0)
    		{
    			last = s;
    		}
    		size++;
    		return TRUE;
    	}
    	Status pop_back()
    	{
    		if (size == 0)
    		{
    			return FALSE;
    		}
    		ListNode<Type> *p = first;
    		while (p->next != last)
    		{
    			p = p->next;
    		}
    		delete last;
    		last = p;
    		last->next = NULL;
    		size--;
    		return TRUE;
    	}
    	Status pop_front()
    	{
    		if (size == 0)
    		{
    			return FALSE;
    		}
    		ListNode<Type> *p = first->next;
    		first->next = p->next;
    		delete p;
    		if (size == 1)
    		{
    			last = first;
    		}
    		size--;
    		return TRUE;
    	}
    	void show_List()
    	{
    		ListNode<Type> *p = first->next;
    		while (p != NULL)
    		{
    			cout << p->data << "->";
    			p = p->next;
    		}
    		cout << "NULL" << endl;
    	}
    	Status insert_val(const Type &x)
    	{
    		ListNode<Type> *p = first;
    		while (p->next != NULL && p->next->data < x)
    		{
    			p = p->next;
    		}
    		if (p->next == NULL)
    		{
    			push_back(x);
    		}
    		else
    		{
    			ListNode<Type> *s = new ListNode<Type>(x);
    			s->next = p->next;
    			p->next = s;
    			size++;
    		}
    		/*
    		ListNode<Type> *s = new ListNode<Type>(x);
    		ListNode<Type> *q = p->next;
    		if(last->data > x)
    		{
    		while(q->data < x )
    		{
    		p = p->next;
    		q = q->next;
    		}
    		p->next = s;
    		s->next = q;
    		size++;
    		}
    		else
    		{
    		push_back();
    		}*/
    
    		return TRUE;
    	}
    	ListNode<Type>* find(const Type &key) const
    	{
    		if (size == 0)
    		{
    			return NULL;
    		}
    		ListNode<Type> *p = first->next;
    		while(p != NULL && p->data != key)
    		{
    		p = p->next;
    		}
    		return p;
    // 		while (p != NULL)
    // 		{
    // 			if (p->data == key)
    // 			{
    // 				return p;
    // 			}
    // 			p = p->next;
    // 		}
    // 		return NULL;
    	}
    	Status delete_val(const Type &x)
    	{
    		if (size == 0)
    		{
    			return FALSE;
    		}
    		ListNode<Type> *p = find(x);
    		if (p == NULL)
    		{
    			return FALSE;
    		}
    		if (p == last)
    		{
    			pop_back();
    		}
    		else
    		{
    			ListNode<Type> *q = p->next;
    			p->data = q->data;
    			p->next = q->next;
    			delete q;
    			size--;
    			return TRUE;
    		}
    		return FALSE;
    		/*	ListNode<Type> *p = first;
    		ListNode<Type> *q = p->next;
    		if(last->data == x)
    		{
    		pop_back();
    		}
    		while(q->data != x)
    		{
    		p = p->next;
    		q = q->next;
    		}
    		p->next = q->next;
    		return TRUE;*/
    	}
    	Status modify_val(const Type &x, const Type &y)
    	{
    		ListNode<Type> *p = find(x);
    		if (p == NULL)
    		{
    			return FALSE;
    		}
    		p->data = y;
    		return TRUE;
    	}
    	int length()
    	{
    		return size;
    	}
    	void clear()
    	{
    		ListNode<Type> *p = first->next;
    		while (p != NULL)
    		{
    			first->next = p->next;
    			delete p;
    			p = first->next;
    		}
    		last = first;
    		size = 0;
    	}
    	void destroy()
    	{
    		clear();
    		delete first;
    		first = last = NULL;
    	}
    	void sort()
    	{
    		if (size==0 || size==1)
    		{
    			return;
    		}
    		ListNode<Type> *p = first->next;
    		ListNode<Type> *q = p->next;
    		last = p;
    		last->next = NULL;
    		while (q != NULL)
    		{
    			p = q;
    			q = q->next;
    
    			ListNode<Type> *s = first;
    			while (p->data > s->next->data && s->next != NULL)
    			{
    				s = s->next;
    			}
    			if (s->next == NULL)
    			{
    				p->next = NULL;
    				last->next = p;
    				last = p;
    			}
    			else
    			{
    				p->next = s->next;
    				s->next = p;
    			}
    		}
    	}
    
    	void resver()
    	{
    		if (size==0 || size==1)
    		{
    			return;
    		}
    		ListNode<Type> *p = first->next;
    		ListNode<Type> *q = p->next;
    		last = p;
    		last->next = NULL;
    		while (q != NULL)
    		{
    			p = q;
    			q = q->next;
    			p->next = first->next;
    			first->next = p;
    		}
    	}
    	Status merge(List<Type> <1, List<Type> <2)
    	{
    		ListNode<Type> *p = lt1.first->next;
    		ListNode<Type> *q = lt2.first->next;
    		ListNode<Type> *s = first;
    		while (p != NULL && q != NULL)
    		{
    			if (p->data < q->data)
    			{
    				s->next = p;
    				p = p->next;
    				s = s->next;
    			}
    			else
    			{
    				s->next = q;
    				q = q->next;
    				s = s->next;
    			}
    		}
    		while (p != NULL)
    		{
    			s->next = p;
    			p = p->next;
    			s = s->next;
    		}
    		while (q != NULL)
    		{
    			s->next = q;
    			q = q->next;
    			s = s->next;
    		}
    		size = lt1.size + lt2.size;
    		return TRUE;
    	}
    	ListNode<Type> *prio(ListNode<Type> *p) const
    	{
    		if (p == NULL || p == first->next)
    		{
    			return NULL;
    		}
    		ListNode<Type> *pr = first;
    		while (pr->next != p)
    		{
    			pr = pr->next;
    		}
    		return pr;
    	}
    	ListNode<Type> *next(ListNode<Type> *p) const
    	{
    		if (p == NULL || p->next == NULL)
    		{
    			return NULL;
    		}
    		ListNode<Type> *q = first;
    		while (q->next != p)
    		{
    			q = q->next;
    		}
    		return q;
    	}
    	ListNode<Type> *Next(const Type &x) const
    	{
    		if (size==0 || size==1)
    		{
    			return NULL;
    		}
    		ListNode<Type> *q = find(x);
    		if (q == NULL)
    		{
    			return NULL;
    		}
    		return q->next;
    	}
    	ListNode<Type> *Prio(const Type &x) const
    	{
    		if(size==0 || size==1)
    		{ 
    			return NULL;
    		}
    		ListNode<Type> *p = first;
    		ListNode<Type> *q = p->next;
    		while (q != NULL)
    		{
    			if (q->data == x)
    			{
    				return p;
    			}
    			p = p->next;
    			q = q->next;
    		}
    		return NULL;
    	}
    private:
    	ListNode<Type> *first;
    	ListNode<Type> *last;
    	size_t         size;
    };
    
    #endif  



    #include "CList.h"
    
    void main()
    {
    	List<int> mylist;
    	List<int> youlist;
    	List<int> mergelist;
    
    	int select = 1;
    	int pos;
    	int item;
    	system("Color 0d");
    	while (select)
    	{
    		cout << "************************************" << endl;
    		cout << "* [0]  quit_system [1] push_back   *" << endl;
    		cout << "* [2]  push_front  [3] show_list   *" << endl;
    		cout << "* [4]  pop_back    [5] pop_front   *" << endl;
    		cout << "* [6]  insert_val  [7] delete_val  *" << endl;
    		cout << "* [8]  merge       [9] next        *" << endl;
    		cout << "* [10] find       [11] sort        *" << endl;
    		cout << "* [12] resver     [13] length      *" << endl;
    		cout << "* [14] clear      [15] destroy     *" << endl;
    		cout << "* [16] modify_val [17] prio        *" << endl;
    		cout << "************************************" << endl;
    		cout << "请选择:>";
    		cin >> select;
    		switch (select)
    		{
    		case 1:
    			cout << "请输入要插入的数据(-1结束):>";
    			while (cin >> item, item != -1)
    			{
    				mylist.push_back(item);
    			}
    			break;
    		case 2:
    			cout << "请输入要插入的数据(-1结束):>";
    			while (cin >> item, item != -1)
    			{
    				mylist.push_front(item);
    			}
    			break;
    		case 3:
    			system("cls");
    			mylist.show_List();
    			system("pause");
    			break;
    		case 4:
    			mylist.pop_back();
    			break;
    		case 5:
    			mylist.pop_front();
    			break;
    		case 6:
    			cout << "请输入要插入的值:>";
    			cin >> item;
    			mylist.insert_val(item);
    			break;
    		case 7:
    			cout << "请输入要删除的值:>";
    			cin >> item;
    			mylist.delete_val(item);
    			break;
    		case 8:
    			for (int i = 1; i < 10; i+=2)
    			{
    				mylist.push_back(i);
    			}
    			for (int i = 2; i < 10; i += 2)
    			{
    				youlist.push_back(i);
    			}
    			mergelist.merge(mylist, youlist);
    			mergelist.show_List();
    			break;
    		case 9:
    			cout << "请输入要查找的值:>";
    			cin >> item;
    			cout << "所在查找值的后继为:" << mylist.Next(item) << endl;
    			break;
    		case 10:
    			cout << "请输入要查找的值:>";
    			cin >> item;
    			cout << "该值指针为:" << mylist.find(item) << endl;
    			break;
    		case 11:
    			mylist.sort();
    			break;
    		case 12:
    			mylist.resver();
    			break;
    		case 13:
    			cout << "线性表的长度为:" << mylist.length() << endl;
    			break;
    		case 14:
    			mylist.clear();
    			break;
    		case 15:
    			mylist.destroy();
    			break;
    		case 16:
    			cout << "请输入要改动的值:>";
    			cin >> item;
    			cout << "请输入改动后的值:>";
    			cin >> pos;
    			mylist.modify_val(item, pos);
    			break;
    		case 17:
    			cout << "请输入要查找的值:>";
    			cin >> item;
    			cout << "所在查找值的前驱为:" << mylist.Prio(item) << endl;
    			break;
    		default:
    			break;
    		}
    	}
    }
    


    执行界面例如以下:


  • 相关阅读:
    面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗
    接口测试基础004----常见的post请求中的参数形式
    JMeter基础017----JMeter自带录制功能使用
    JMeter基础016----JMeter文件上传与下载
    JMeter基础018----生成HTML测试报告
    JMeter基础019----JMeter接口功能、性能、自动化测试
    接口测试基础002----HTTP请求、RESTful风格
    Jmeter报错001--- ERROR o.a.j.JMeter: Uncaught exception in thread Thread[AWT-EventQueue-0,6,main] java.lang.InternalError: Could not bind shell folder to interface
    Jmeter基础014----组件总结、FTP(了解)及其他不重要组件
    Jmeter基础013----图形监视器之监控服务器资源
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7136032.html
Copyright © 2011-2022 走看看