数据结构之单链表

假期有时间能够把数据结构的知识好好的梳理一遍,无论是将来的学习还是工作,数据结构的知识都是非常重要的。

搜索了网上关于数据结构的实现,众说分云,多种多样,有些还是错误的。所以为了真正弄懂这方面的知识,让自己少走些弯路,决定写点关于数据结构的东西,互相学习下。

//               实现单链表           //

  主要有以下几个功能:    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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值