假期有时间能够把数据结构的知识好好的梳理一遍,无论是将来的学习还是工作,数据结构的知识都是非常重要的。
搜索了网上关于数据结构的实现,众说分云,多种多样,有些还是错误的。所以为了真正弄懂这方面的知识,让自己少走些弯路,决定写点关于数据结构的东西,互相学习下。
////////////////////////////// 实现单链表 //////////////////////////////////////////////
主要有以下几个功能: 1。创建单链表,指定长度大小
2。输出单链表的内容
3。返回链表长度
4。删除链表中的某个值
5。前插和后插
6。替代
/// LinkList.h ///
#ifndef _LINKLIST_H
#define _LINKLIST_H
typedef struct LNode
{
int data;
LNode *next;
}LNode,*pLinkList;
class LinkList{
public :
LNode *head;
LinkList();
~LinkList();
void createList(int n);
void outList(void);
int sizeList(void);
void destroyList(int data);
void insertList(int aData,int bData);
void replaceList(int aData, int bData);
void insertlastList(int aData ,int bData);
};
#endif
/// LinkList.cpp ////
#include<stdio.h>
#include<stdlib.h>
#include"LinkList.h"
#include<iostream>
//typedef int ElemType;
using namespace std;
LinkList::LinkList(){
head =NULL;
}
//创建指定大小的链表//
void LinkList::createList(int n)
{
LNode *temp;
temp = head;
cout<<"input a number: "<<endl;
cin>>temp->data;
for(int i=1;i<n;i++)
{
cout<<"input a number: "<<endl;
LNode *p=new LNode();
cin>>p->data;
temp->next=p;
temp = p;
}
}
//输出链表内的内容//
void LinkList::outList(void)
{
LNode *temp = head;
while(NULL != temp)
{
cout<<temp->data<<"\t";
temp = temp->next;
}
cout<<endl;
}
//链表长度//
int LinkList::sizeList(void)
{
int size = 0;
LNode *p =head;
while(NULL!=p)
{
size++;
p = p->next;
}
return size;
}
//删除链表中的某个值//
void LinkList::destroyList(int data)
{
LNode *p,*pPre;
p=head;
if(p->data == data)//删除第一个节点
{
head = p->next;
delete p;
}
else
{
while(p->data != data && p->next != NULL)
{
pPre=p;
p=p->next;
}
if(p->next == NULL)
cout<<"没有找到。。。"<<endl;
if(p->data == data)
{ pPre->next = p->next;
delete p;
}
}
}
//在节点aData前插入节点bData//
void LinkList::insertList(int aData,int bData)
{
LNode *p , *pPre ,*s;
s =(LNode*) new LNode();
s->data =bData;
p =head;
if(p->data == aData)//在第一个节点前插值
{
s->next=p;
head =s;
}
else{
while(p->data !=aData && p->next !=NULL)
{
pPre =p;
p=p->next;
}
if(p->next == NULL)
cout<<"没有找到要插入的数"<<endl;
if(p->data == aData)
{
pPre->next=s;
s->next=p;
}
}
}
//用节点bData替代节点aData//
void LinkList::replaceList(int aData ,int bData)
{
LNode *p, *pPre, *s;
s =(LNode*)new LNode();
s->data =bData;
p=head;
if(p->data == aData)
{
s->next=p->next;
head = s;
}
else{
while(p->data!=aData && p->next!=NULL){
pPre =p;
p=p->next;
}
if(p->next ==NULL)
cout<<"没有找到要替换的数值。。。"<<endl;
if(p->data ==aData)
{
pPre->next=s;
s->next =p->next;
}
}
}
//把节点bData插入在节点aData之后//
void LinkList::insertlastList(int aData ,int bData)
{
LNode *p, *s;
s =(LNode*)new LNode();
s->data =bData;
p=head;
while(p->data!=aData && p->next!=NULL)
{
p=p->next;
}
if(p->next ==NULL)
cout<<"没有找到被插的数。。。"<<endl;
if(p->data ==aData)
{
s->next=p->next;
p->next =s;
}
}
LinkList::~LinkList(){}
/// main.cpp ////
#include<iostream>
#include"LinkList.h"
using namespace std;
int main(){
LNode *pHead = new LNode();
LinkList list;
list.head = pHead;
int n=0;
int d=0;
int c=0;
int ch=0;
int th=0;
int t=0;
int cch=0;
int cc=0;
//list.initList(pHead);
cout<<"设定你要输入的链表长度:"<<"\t";
cin>>n;
while(n<=0){
cout<<"重新输入"<<endl;
cin>>n;
}
list.createList(n);
cout<<"链表创建成功。。。"<<endl;
list.outList();
cout<<"链表的长度。。。"<<endl;
cout<<list.sizeList()<<endl;
cout<<"输入你要删除的那个数:"<<"\t";
cin>>d;
list.destroyList(d);
cout<<"此刻的链表。。。"<<endl;
list.outList();
cout<<"链表的长度。。。"<<endl;
cout<<list.sizeList()<<endl;
cout<<"输入你要插在那个数之前:"<<"\t";
cin>>ch;
cout<<"输入要插的数: "<<"\t";
cin>>c;
list.insertList(ch,c);
cout<<"此刻的链表。。。"<<endl;
list.outList();
cout<<"链表的长度。。。"<<endl;
cout<<list.sizeList()<<endl;
cout<<"输入被替换的数值: ";
cin>>th;
//cout<<endl;
cout<<"输入替换后的值: ";
cin>>t;
list.replaceList(th,t);
cout<<"此刻的链表。。。"<<endl;
list.outList();
cout<<"链表的长度。。。"<<endl;
cout<<list.sizeList()<<endl;
cout<<"输入你要插在那个数之后:"<<"\t";
cin>>cch;
cout<<"输入要插的数: "<<"\t";
cin>>cc;
list.insertlastList(cch,cc);
cout<<"此刻的链表。。。"<<endl;
list.outList();
cout<<"链表的长度。。。"<<endl;
cout<<list.sizeList()<<endl;
}