#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;
}
教科书上的单链表定义及基本操作
最新推荐文章于 2023-10-26 21:18:42 发布