线性表的表示和实现方式之链式表示和实现
? ? ?最近收拾東西,偶然發現大學時候的課本數據結構在亂叢當中,上大學時候看的比較多的一本。一陣感慨之后,果斷重新翻看了兩眼。看完線性表表這一章突發奇想想在實現一下鏈表。經過整整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
轉載于:https://www.cnblogs.com/fantiantian/archive/2012/06/08/2541483.html
總結
以上是生活随笔為你收集整理的线性表的表示和实现方式之链式表示和实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一道异常处理执行顺序面试题的简单分析
- 下一篇: 一到关于js函数的前端面试题引发的血案