教科书上的单链表定义及基本操作

本文详细介绍了如何使用C++实现单链表的初始化、插入、删除等基本操作,并通过实例展示了从表头和表尾创建单链表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int DataType;
class Item{
	public:
		   DataType data;
		   Item* next;
		   Item(){
		   	    next=0;
		   }
}; 
class Link{
	public:
		Item* head;
		Link(){head=0;}
		~Link(){DeleteAll();}
		void Initiate();
		void DeleteAll();
		void HeadCreate(int n);
		void TailCreate(int n);
		void HeadCreateWithHead(int n);
		void TailCreateWithHead(int n);
		int Length();
		Item* LocateWithData(DataType x);
		Item* LocateWithNum(int i);
		DataType Get(int i);
		bool Insert(DataType x,int i);
		bool Delete(int i);
		void Print();
};
void Link::Initiate(){
	DeleteAll();
	head=0;
}
//从表尾到表头建立单链表 
void Link::HeadCreate(int n){
	DeleteAll();
	Item* s,* p;
	p=0;
	for(int i=1;i<=n;i++){
		s=new Item();
		cin>>s->data;
		s->next=p;
		p=s;
	}
	head=p;//表头不一定是节点结构 
}
//从表头到表尾建立单链表
void Link::TailCreate(int n) {
	Item* s,* r,* p;
	DeleteAll();
	p=0;
	for(int i=1;i<=n;i++){
		s=new Item();
		cin>>s->data;
		s->next=0;
		if(0==p)p=r=s;
		else{
			r->next=s;//不是一个节点的指针能有next么? 但是他指向节点(含有next 
			r=s;
		}
	}
    head=p;
}
//从表尾到表头建立单链表(带有空白头节点) 
void Link::HeadCreateWithHead(int n) {
	Item* s,*p;
	DeleteAll();
	p=new Item();//应该是这个不一样了 
	p->next=0;
	for(int i=1;i<=n;i++){
		s=new Item();
		cin>>s->data;
		s->next=p->next;
		p->next=s;
	}
	head=p;
}
//从表头到表尾建立单链表( 带有空白头节点) 
//对于带空白头节点的单链表在空表和非空表的运算处理基本一致了 
void Link::TailCreateWithHead(int n){
	Item* s,*r,*p;
	DeleteAll();
	p=new Item();//note!!!
	p->next=0;
	r=p;
	for(int i=1;i<=n;i++){
		s=new Item();
		cin>>s->data;
		r->next=s;
		r=s;
	}
	r->next=0;
	head=p;
}
//求表长 
int Link::Length(){
	int len;
	Item* p;
	len=0;
	p=head->next;
	while(p) {
		len++;
		p=p->next;
	}
	return len;
} 
//查找操作(1)按序号查找 
Item* Link::LocateWithNum(int i) {
	int j=1;
	Item* p;
	if(0==i) return head;
	p=head->next;
	while(p&&j<i){
		p=p->next;
		j++;
	}
	if(j==i)return p;
	return 0;
	
}
//查找操作(2)按值查找
Item* Link::LocateWithData(DataType x){
	Item* p;
	p=head->next;
	while(p&&p->data!=x)p=p->next;
	return p;
}
//读取第i个位置上的元素值
DataType Link::Get(int i) {
	int j;
	Item* p;
	j=1;
	p=head->next;
	while((j<i)&&p) {
		j++;
		p=p->next;
	}
	if((0==p)||(j>i))return 0;
	else return p->data;
}
//前插节点
bool Link::Insert(DataType x,int i) {
	Item* p,* s;
	p=LocateWithNum(i-1);
	if(0==p)return false;
	s=new Item();
	s->data=x;
	s->next=p->next;
	p->next=s;
	return true;
	//插入操作如果是按序号来插入的话则是On效率,如果给定某指针后面则是o1效率 
    //删除运算不论给出的是序号或者还是指针
//都是要遍历一遍找出前驱,因为用调换某指针后面和某指针的位置 再删除
//的话如果碰上该节点是最后一个节点则不能成功运行
//所以删除操作都是On效率 
}
//删除节点
bool Link::Delete(int i) {
	int j;
	Item* p=LocateWithNum(i-1);
	Item* q;
	if(0==p)return false;
	q=p->next;
	if(q){
	
	   p->next=q->next;
	   delete q;
	   q=0;
	   return true;
	}   
}
//打印
void Link::Print(){
	Item* p;
	p=head->next;
	while(p){
		cout<<p->data<<endl;
		p=p->next;
	}
} 
//删除所有节点
void Link::DeleteAll(){
	Item* p=head,*q;
	while(p){
		q=p->next;
		delete p;
		p=q;
	}
} 
int main(){
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值