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