最近收拾东西,偶然发现大学时候的课本数据结构在乱丛当中,上大学时候看的比较多的一本。一阵感慨之后,果断重新翻看了两眼。看完线性表表这一章突发奇想想在实现一下链表。经过整整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");    }  

  

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

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

环境VS2010