#include<iostream>
using namespace std;
typedef struct linkNode{
int data ;
linkNode *next;
}*link,Node;
class LinkList{
public:
LinkList(){
this->head =linkInit();
}
link linkInit();//初始化链表
void headInsert();//头插法
void tailInsert();//尾插法
void insert(int x);//尾部插入一个结点
int isEmpty();//判空
int deleteMax();//删除最大值
void deleteRepeat();//删除重复值
void print(link head);//打印链表
void Reverse();//链表逆置
link linkCopy();//拷贝链表
link getHead();//获取头指针
void LinkSort();//排序
void searchLastk(int k);//查找倒数第k个元素(一次遍历)
int getLength();
// link oddEvenList();
private:
link head;
};
int LinkList::getLength(){
int length = 0;
while(head->next!=NULL) {
head = head->next;
length++;
}
return length;
}
link LinkList::getHead(){
return this->head;
}
link LinkList::linkInit(){ //初始化链表
head = new linkNode;
head->data = -1;
head->next = NULL;
return head;
}
void LinkList::headInsert(){ //头插法
int x;
cin>>x;
while(x!=9999){
link p = new linkNode;
p->data = x;
p->next = head->next ;
head->next = p;
cin>>x;
}
}
void LinkList::tailInsert(){ //尾插法
int x;
link tail = head;
cin>>x;
while(x!=9999){
while(tail->next!=NULL)
tail = tail->next;
if(tail->next==NULL){
link p =new linkNode;
p->data = x;
p->next = NULL;
tail->next = p;
tail = p;
}
cin>>x;
}
}
void LinkList::insert(int x){ //尾部插入一个结点
link tail = head;
while(tail->next!=NULL)
tail = tail->next;
link s = new Node;
tail->next = s;
s->data = x;
s->next = NULL;
cout<<"插入"<<x<<endl;
}
int LinkList::isEmpty(){ //判空
if(head->next==NULL) return 1;
else return 0;
}
int LinkList::deleteMax(){ //删除最大值
int temp ;
link p =head->next,pre=head,premax=head,max = head->next;
temp = p->data; //同时偏移指针pre、p 记录最大值位置指针max,记录最大值前一个结点位置指针premax
while(p!=NULL){
if(max->data<p->data){ //找到更大结点
max = p; //将max指向该节点
premax = pre;//premax指向该节点前驱结点pre
temp = max->data;
}
pre = p;//pre偏移
p = p->next;//p偏移
}
premax->next = max->next;
delete(max);
cout<<"删除的最大值为:"<<temp<<endl;
return temp;
}
void LinkList::deleteRepeat(){//删除连续重复结点
link pre = head->next;
link p = pre->next;
while(p!=NULL){
if(pre->data!=p->data) {
pre = p;
p = p->next;
}
else{
while(p->next->data==pre->data)
p = p->next;
pre->next = p->next;
p = p->next;
cout<<"删除连续重复结点"<<pre->data<<endl;
}
}
}
void LinkList::Reverse(){ //原地逆置链表
cout<<"链表开始逆置"<<endl;
link pre = NULL, p = head->next, r;
while(p!=NULL){ //当p所指结点不为空
r = p->next;//将p所指下一结点暂存
p->next = pre;//将p所指结点的指针域指向前一结点
pre = p;//pre指针后移
p = r;//p指针后移
}
head->next = pre;
}
void LinkList::print(link head){
link p = head->next;//注意!!不能直接移动head ,会改变head指向,影响后续调用
while(NULL!=p){
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
}
link LinkList::linkCopy(){ //尾插法拷贝链表
link cphead = new Node;
link p = head->next;
link r = cphead;
while(p!=NULL){
link s = new Node;
s->data = p->data;
r->next = s;
r = s;
p = p->next;
}
r->next = NULL;
cout<<"copyList"<<endl;
return cphead;
}
void LinkList::LinkSort(){//链表排序 (类似直接插入排序)
link pre = head,p = head->next,r = p->next;//pre用于搜寻插入位置
p->next = NULL;
p=r;
while(p!=NULL){
pre = head ;//每次搜寻从头开始
r = p->next;
while(pre->next!=NULL&&pre->next->data<p->data) pre = pre->next;
p->next = pre->next;
pre->next = p;
p = r;
}
cout<<"链表排序:" <<endl;
}
void LinkList::searchLastk(int k){//查找倒数第k个元素
link p,q;
p = head->next;q = head->next;
int move = k-1;
if(k<=0||k>this->getLength()) {
cout<<"查找位置不合法"<<endl;
return;
}
while(move--!=0) p = p->next;
while(p->next!=NULL){
p = p->next;
q = q->next;
}
cout<<"查找倒数第"<<k<<"个元素为:"<<q->data<<endl;
}
int main(){
LinkList L ;
L.tailInsert();
L.print(L.getHead());
int i = L.deleteMax();
L.print(L.getHead());
L.Reverse();
L.print(L.getHead());
link cphead = L.linkCopy();
L.print(cphead);
L.insert(100);
L.print(L.getHead());
L.deleteRepeat();
L.print(L.getHead());
L.LinkSort();
L.print(L.getHead());
L.searchLastk(5);
return 0;
}
链表
最新推荐文章于 2024-06-14 09:15:00 发布