特点:有一个空的头节点,不包含有效数据
//链表复习
//自己实现C++链表类
#include <iostream>
using namespace std;
//创建节点类
class Node
{
//需要声明为公共成员,因为c++类默认为私有
public:
int data;
Node* next;
};
//创建链表类
class LinkedList
{
private:
Node *head;
public:
//首先是构造函数,无参构造是先搞定头节点,用尾插法后面再插入元素
LinkedList()
{
head = new Node;
head->next = NULL;
}
//有参构造
LinkedList(int num)
{
//通过键盘输入存入链表
head = new Node;
Node* pre = head;
for(int i=0;i<num;i++)
{
Node* p = new Node;
cin>>p->data;
p->next=NULL;
pre->next = p;
pre = p;
}
}
//尾插法添加元素
void append(int num)
{
//要考虑到一个链表只有头节点的情况
if(head->next == NULL)
{
Node *p = new Node;
p->data = num;
p->next = NULL;
head->next = p;
return;
}
Node *p=NULL;
for(p=head->next;p->next!=NULL;p=p->next){}
Node *end = new Node;
end->data = num;
end->next = NULL;
p->next = end;
}
//遍历链表
void displayList()
{
for(Node* p=head->next;p!=NULL;p=p->next)
{
cout<<p->data<<" ";
}
cout<<endl;
}
//在指定的位置添加元素
void addElementAt(int data,int num)
{
int i=0;
Node *pre=NULL;
for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
Node* p=new Node;
p->data = data;
p->next = pre->next;
pre->next = p;
}
//链表指定位置删除元素
void deleteElement(int num)
{
int i=0;
Node *pre = NULL;
for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
Node *p =pre->next;//提前先记下被删除节点的地址值,方便之后进行delete操作
pre->next=pre->next->next;
delete p;
}
//链表指定位置改变数值
void SetData(int num,int data)
{
int i=0;
Node *p=NULL;
for(p=head->next;i<num;p=p->next,i++){}
p->data = data;
}
//链表指定位置查看
void viewData(int num)
{
int i=0;
Node* p=NULL;
for(p=head->next;i<num;p=p->next,i++){}
cout<<p->data<<endl;
}
//链表的冒泡排序
void BubbleSortList()
{
Node* end=NULL;
//先确定好end的初识值
for(Node* p=head->next;p!=NULL;p=p->next)
{
if(p->next == NULL)
{
end=p;
}
}
for(Node* p=head->next;p->next!=NULL;p=p->next)
{
for(Node* q=head->next;q!=end;q=q->next)
{
if(q->data>q->next->data)
{
//只用交换数据即可
int tmp;
tmp=q->next->data;
q->next->data=q->data;
q->data=tmp;
}
}
for(Node* q=head->next;q!=end;q=q->next)
{
if(q->next == end)
{
end=q;
break;
}
}
}
}
};
//创建链表的函数
//创建的链表在堆上,只需输入参数要生成多少个节点即可,返回头节点的地址
Node* createList(int num)
{
//通过键盘输入存入链表
Node* head = new Node;
Node* pre = head;
for(int i=0;i<num;i++)
{
Node* p = new Node;
cin>>p->data;
p->next=NULL;
pre->next = p;
pre = p;
}
return head;
}
//在尾部添加数据(尾插法)
void append(int num,Node* head)
{
//要考虑到一个链表只有头节点的情况
if(head->next == NULL)
{
Node *p = new Node;
p->data = num;
p->next = NULL;
head->next = p;
return;
}
Node *p=NULL;
for(p=head->next;p->next!=NULL;p=p->next){}
Node *end = new Node;
end->data = num;
end->next = NULL;
p->next = end;
}
//遍历链表数据
void displayList(Node* head)
{
for(Node* p=head->next;p!=NULL;p=p->next)
{
cout<<p->data<<" ";
}
cout<<endl;
}
//链表指定位置添加元素
void addElementAt(int data,int num,Node *head)
{
int i=0;
Node *pre=NULL;
for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
Node* p=new Node;
p->data = data;
p->next = pre->next;
pre->next = p;
}
//链表指定位置删除元素
void deleteElement(int num,Node*head)
{
int i=0;
Node *pre = NULL;
for(pre=head;i<num;pre=pre->next,i++){}//先要到达指定位置的前一个节点
Node *p =pre->next;//提前先记下被删除节点的地址值,方便之后进行delete操作
pre->next=pre->next->next;
delete p;
}
//链表指定位置改变数值
void SetData(int num,int data,Node* head)
{
int i=0;
Node *p=NULL;
for(p=head->next;i<num;p=p->next,i++){}
p->data = data;
}
//链表指定位置查看
void viewData(int num,Node* head)
{
int i=0;
Node* p=NULL;
for(p=head->next;i<num;p=p->next,i++){}
cout<<p->data<<endl;
}
//链表的冒泡排序
void BubbleSortList(Node *head)
{
Node* end=NULL;
//先确定好end的初识值
for(Node* p=head->next;p!=NULL;p=p->next)
{
if(p->next == NULL)
{
end=p;
}
}
for(Node* p=head->next;p->next!=NULL;p=p->next)
{
for(Node* q=head->next;q!=end;q=q->next)
{
if(q->data>q->next->data)
{
//只用交换数据即可
int tmp;
tmp=q->next->data;
q->next->data=q->data;
q->data=tmp;
}
}
for(Node* q=head->next;q!=end;q=q->next)
{
if(q->next == end)
{
end=q;
break;
}
}
}
}
void test01()
{
Node* head = createList(10);
BubbleSortList(head);
displayList(head);
addElementAt(11,1,head);
displayList(head);
deleteElement(1,head);
displayList(head);
SetData(2,2,head);
displayList(head);
viewData(3,head);
append(100,head);
displayList(head);
}
void test02()
{
LinkedList list(10);
list.BubbleSortList();
list.displayList();
list.addElementAt(11,1);
list.displayList();
list.deleteElement(2);
list.displayList();
list.SetData(2,2);
list.displayList();
list.viewData(3);
list.append(100);
list.displayList();
}
//测试
int main()
{
freopen("In.txt","r",stdin);
test02();
return 0;
}
本次笔记为本人学习数据结构时复习前面学过的链表有感而发,如有错误请各位大佬指正!