zoukankan      html  css  js  c++  java
  • 线性表的表示和实现方式之链式表示和实现

         最近收拾东西,偶然发现大学时候的课本数据结构在乱丛当中,上大学时候看的比较多的一本。一阵感慨之后,果断重新翻看了两眼。看完线性表表这一章突发奇想想在实现一下链表。经过整整1天半的时间才就有了此文,主要是C++连怎么声明类都不记得了,囧。下面代码部分C++实现的线性表的链式表示和实现。C#是实现的静态链表。本人水平有限,如果有不恰当之处,望大家多多指点。口下留情。

    线性表:

      是最常用且是最简单的一种数据结构。简言之,一个线性表是N个数据元素的有限序列。线性表有两种表现和实现方式。线性表的顺序表示和实现线性表的链式表示和实现。线性表属于线性结构,线性结构有一下特点。

    • 存在惟一的一个被称作做"第一个"的数据元素。
    • 存在惟一的一个被称做"最后一个"的数据元素。
    • 除了第一个之外,集合中每一个数据元素均有一个前驱。
    • 除最后一个外,集合中每个数据元素均有一个后继。 

       别不多说,先上代码:

         定义一个类LinkList,表示节点信息,这个是该类的.h文件。

    //节点信息
    
    #pragma once
    /***
    *链表的节点,
    *有节点的数据和下一个节点的地址
    *一个默认的构造函数和一个重载的构造函数
    *一个析构函数
    **/
    class LinkList
    { 
    public:
    	int data;
    	LinkList* next; 
    	LinkList(void); 
    	LinkList(int m_data,LinkList *m_next);
    	~LinkList(void); 
    };
    

      下面是LinkList类的内容,只是头文件中声明函数的空实现:

    #include "LinkList.h"
    #include <iostream>    
    LinkList::LinkList(void)
    {  
    	
    }
    
    LinkList::LinkList(int m_data,LinkList *m_next)
    {   
    }
    
    
    LinkList::~LinkList(void)
    {
    } 
    

      下面定义一个类LinkOperate,用来对LinkList对象进行操作:LinkOperate的头文件为:

    #include "LinkList.h"
    #pragma once
    class LinkOperate
    {
    public:
    	//默认的构造函数
    	LinkOperate(void);
    	//插入数据
    	LinkList*  insertList(LinkList*myLinkList, int data);
    	//删除第一个给定的值
    	LinkList*  deleteListNode(LinkList*myLinkList, int data);
    	//查找指定的值
    	void  searchList(LinkList*myLinkList, int data);
    	//默认的析构函数
    	~LinkOperate(void);
    };
    

      LinkOperate类的.cpp文件如下:

    #include "LinkList.h"
    #include "LinkOperate.h"
    #include <iostream>
    using namespace std; 
    
    LinkList*  LinkOperate::insertList(LinkList* myLinkList, int data){
    	LinkList* T = myLinkList; 
    	LinkList* p; 
    	while(T->next != NULL){
    	 T  = T->next;
    	}
    	p = (LinkList * ) malloc(sizeof(LinkList));
    	p->data  = data;
    	p->next = NULL;
    	myLinkList->data ++;
    	cout<<"插入值为:"<<data<<"地址为:"<<p<<endl;
    	T->next = p;
    	return myLinkList;
    }  
    void LinkOperate::searchList(LinkList* myLinkList, int data)
    {
    	LinkList* P = myLinkList->next;
    	while(P->data!=data&&P->next)
    	{
    		P=P->next;
    	}
    	if(P->data == data){
    		
    		cout<<"找到了值:"<<data<<"地址为:"<<P<<endl; 
    		return;
    	}
    	cout<<"不存在值:"<<data<<endl;
    	
    }
    LinkList* LinkOperate::deleteListNode(LinkList* myLinkList, int data)
    {
    	LinkList* P = myLinkList;
    	LinkList* Q = P->next;
    
    	while(Q->data!=data&&Q->next)
    	{
    		P= P->next;
    		Q= Q->next;
    	}
    	if(Q->data == data)
    	{
    		P->next->next = Q->next;
    		myLinkList->data --;
    		return myLinkList;
    	}
    	cout<<"不存在值:"<<data<<endl;
    	return myLinkList;
    }
    LinkOperate::LinkOperate(void)
    {
    }
    LinkOperate::~LinkOperate(void)
    {
    }
    

       单向链表在删除元素的时候要记两个值,如 LinkList* P = myLinkList; LinkList* Q = P->next;如果是双向链表的话就不要求了。

            准备完毕之后是检查结果的时候了,一下是对以上部分的测试:

    #include<iostream>
    #include "LinkList.h"
    #include "LinkOperate.h"
    
    using namespace std; 
    int main(){
    	int n = 0;
    	LinkList myLinkList = LinkList(1,NULL);
    	LinkOperate operateLink;
    	myLinkList.data = 0;
    	myLinkList.next = NULL;
    	while(n < 40){ 
    		operateLink.insertList(&myLinkList,n);
    	n++;
    	} 
    
    	operateLink.searchList(&myLinkList,50); 
    
    	operateLink.deleteListNode(&myLinkList,39);
    
    	cout<<"删除的结果为:"<<endl;
    
    	while(myLinkList.next)
    	{
    		cout<<myLinkList.data<<endl;
    		myLinkList = *myLinkList.next;
    	}
    
    	system("pause");
    
    }
    

      

    源代码下载:https://files.cnblogs.com/fantiantian/linkedlist.rar

    源代码中包含C#实现的静态链表,静态链表的相关内容会在下一篇中体现。

    环境VS2010

  • 相关阅读:
    Setting a maximum attachment size
    一机多屏,屏幕顺序容易错?
    node.js " The requested service provider could not be loaded or initialized"
    VS2008中MFC对话框界面编程Caption中文乱码的解决办法
    The application was unable to start correctly (0xc000007b)
    FreeType的项目总是报error LNK2019: unresolved external symbol __imp错误
    MFC对话框:模态对话框及其弹出过程
    MFC如何获取硬盘的序列号
    SharePoint CAML Query小结
    ECS Navicat for MySQL远程连接报10038的错误
  • 原文地址:https://www.cnblogs.com/fantiantian/p/2541483.html
Copyright © 2011-2022 走看看