单链表 C++
目录
菜鸡乱啄开始:
- 先在.h文件中定义结点的数据结构和链表类,类中是构造函数和各种函数的声明 [我好像没写析构函数 ~那个 是叫析构8] (我有参考网上代码资料的 侵权删?(最基本的数据结构的代码讲究这个吗?我还不知道 好无知哦))
ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
/**
* 定义结构写在.h文件里
* 结构中说明结点的存储结构
* 定义类也写在.h文件里
* 类中声明基本操作
*
*/
struct Node{
int data;//结点中的数据域
struct Node *next;//结点中的指针域
};//可在此处声明变量如 node1和linkList
class LinkList {
/**
* 类中只是声明方法和变量(说明有这个东西),
* 并没有实际的定义(说明他具体是什么 怎么操作)
*/
private:
int length;
Node *Head;//头结点
public:
LinkList();
/*
* 构造函数,不写默认是不带参数的,
* 可自己声明带参数的 和构造函数中
* 你要求其做的事情
*/
void CreateList_H(int n);//前插法创建链表(栈式)
void CreateList_R(int n);//后插法创建链表(队列式)
bool InsertList(int i, int data);//插入
bool DeleteList(int i);//删除指定结点上的数据
int GetData(int i);//根据结点序号i获取第i个结点中的元素(取值)
int LocateElem(int elem);//返回数据域中是值elem的结点元素
int GetLength();//获取链表长度
void Display();//遍历整个链表
};
#endif // LINKLIST_H_INCLUDED
- 再新建一个.cpp文件(最好与.h文件同名,这个样子比较好认好找,知道哪个是哪个辣),在这个cpp文件中定义.h中声明的函数。
#include <iostream>
#include "LinkList.h"
using namespace std;
/** 在.h文件中声明的函数在此处进行定义 **/
/*
*(1)作用域限定符,当在类体中直接定义函数时,
* 不需要在函数名字的前面加上类名,
* 但是在类体外实现函数定义的时候,
* 必须加上类名并且加上作用域限定符。Student::Display();
*
*(2)静态数据成员既可以通过对象名引用,也可以通过类名加::来引用,
*/
//构造函数
LinkList::LinkList(){
Head = new Node;
/**
*定义头结点(注意头结点和首元结点的区别,
*头结点是空结点,首元结点是第一个元素
*头指针指向头结点
*/
Head->next = nullptr;//头结点指针置空
length = 0;
}
//前插法创建链表
/**
* 前插法是新添加的元素永远在第一个,也就是在头结点之后
*/
void LinkList::CreateList_H(int n){
//LinkList L = new LinkList();
Node *temp = Head;//现在temp是一个指向头结点的指针
Node *p;
// L.Head = nullptr;
for(int i=0; i<n; i++){
p = new Node;
cout << "请输入链表中倒数第" << i+1 << "个元素的值:" <<endl;
cin >> p->data;
p->next = temp->next;//
temp->next = p;
length++;
}
}
//后插法创建链表
void LinkList::CreateList_R(int n){
//LinkList L = new LinkList();
Node *temp = Head;
Node *p;
for(int i=0; i<n; i++){
p = new Node;
cout << "请输入链表中第" << i+1 << "个元素的值:" <<endl;
cin >> p->data;
p->next = nullptr;
temp->next = p;
temp = p;
length++;
}
}
//插入
bool LinkList::InsertList(int i, int elem){
Node *temp = Head;
Node *p = new Node;
p->data = elem;
int j=0;
while(temp && j<i-1){
temp = temp->next;
j++;
}
if(!temp || j>(i-1)){
cout << "INSER ERROR" << endl;
return false;
}
else{
p->next = temp->next;
temp->next = p;
length++;
cout << "HAVE INSERTED" <<endl;
return true;
}
}
//删除
bool LinkList::DeleteList(int i){
Node *p = Head;//头结点开始往下遍历
Node *temp;//用于暂时存放要被删除的结点
int j = 1;
while(p && j<=i-1){
p = p->next;
j++;
}
if(j>i || !p){
cout << "DELETE ERROR" << endl;
return false;
}else{
temp = p->next;
p->next = temp->next;
length--;
cout << "HAVE DELETED" <<endl;
return true;
}
}
//获取元素
int LinkList::GetData(int i){
Node *p = Head;
int j = 0;
while(p && j<i){
p = p->next;
j++;
}
if(!p || j>i){
cout << "GET ELEMENT ERROR" << endl;
return -1;
}else{
cout << "GET ELEMENT OK" << endl;
return p->data;
}
}
//查找第一个元素值为elem的值并返回其结点个数
int LinkList::LocateElem(int elem){
Node *p = Head;
int j = 1;
while(p && p->data!=elem){
p = p->next;
j++;
}
if(p && p->data==elem){
cout << "ELEMENT HAVE BEEN FOUND" << endl;
return j;
}else if(!p || j > length){
cout << "ELEMENT HAVE NOT BEEN FOUND" << endl;
return -1;
}
}
//返回长度
int LinkList::GetLength(){
return length;
}
//遍历整个链表
void LinkList::Display(){
Node *p = Head;
for(int i=1; i<=length; i++){
p = p->next;
cout << p->data << ends;
}
}
还有main文件咯~ 在main里进行运行,建议是写完一个函数debug一次鸭(好小白)
#include <iostream>
#include "LinkList.h"
using namespace std;
int main()
{
LinkList l;
l.CreateList_R(5);
//cout << l.Head->next->next->data << endl;
//l.InsertList(2, 6);
//cout << l.Head->next->data << endl;
l.DeleteList(1);
//cout << l.Head->next->next->data << endl;
//int a = l.GetData(5);
//cout << a <<endl;
//int b = l.LocateElem(61);
//cout << b << endl;
int lenth = l.GetLength();
cout << "Length is:" << lenth << endl;
l.Display();
return 0;
}
qiang~~ 单链表打卡,下一个写 循环链表还是双链表捏?
(这到底算不算原创鸭????)