在家整理了一下数据结构方面的知识,想自己动手实现一个单链表。主要实现操作有:
- 通过尾插法建立单链表
- 通过匹配的值开查找链表中的元素
- 通过序列来去链表中的元素
- 插入元素(前插、后插)
- 删除元素
- 遍历显示
下面就是代码了:首先是主函数
main.cpp
#include <iostream>
#include"lklist.h"
using namespace std;
int main()
{
MyLkList s;
int arr[] = {1,2,4,5,9};
s.Create_rear_LkList(arr,5);
s.Dis_LkList();
LinkListNode* pos = s.LocateLinkList(4);
s.Insert_After_LkList(pos,99);
s.Dis_LkList();
// s.Del_LkList(pos);
// s.Dis_LkList();
s.Insert_Before_LkList(pos,88);
s.Dis_LkList();
return 0;
}
然后是一个链表类:
LkList.h
#ifndef LKLIST_H
#define LKLIST_H
typedef struct Node
{
int data;
Node *pNext;
}LinkListNode;
class MyLkList
{
public:
//初始化
MyLkList();
//求长度,返回值:是顺序表的长度,参数是pHead:是单链表的头节点
int GetSize_LkList();
//取元素:返回值是:第i个元素的地址,pHead:头指针 i:待查节点的序号
LinkListNode* GetLinkList(int i);
//查元素:pHead:单链表的头指针,objData:需要匹配的值
LinkListNode* LocateLinkList(int objData);
//建立链表:返回值:链表的头指针,arr:传入的顺序表,length:顺序表的长度
LinkListNode* Create_rear_LkList(int arr[],int length);
//插入元素:ptr:待插入的元素位置,将在ptr的后继节点中插入,x:插入的值
void Insert_After_LkList(LinkListNode* ptr,int x);
//插入元素:ptr:待插入的元素位置,将在ptr的前驱节点中插入,x:插入的值
void Insert_Before_LkList(LinkListNode *ptr,int x);
//删除节点:Ptr是需要删除的节点,将删除Ptr的后继节点。返回值:是删除待删除的节点位置
LinkListNode* Del_LkList(LinkListNode* ptr);
//遍历
void Dis_LkList();
private:
LinkListNode* pHead = nullptr;
};
#endif // LKLIST_H
LkList.cpp
#include "lklist.h"
#include<stdlib.h>
#include<iostream>
MyLkList::MyLkList()
{
int len = sizeof (LinkListNode);
pHead = static_cast<LinkListNode*>(malloc(len));
if(pHead)
pHead->pNext = nullptr;
}
int MyLkList::GetSize_LkList()
{
int n = 0;
LinkListNode* p = pHead;
while(p->pNext!=nullptr)
{
n++;
p =p->pNext;
}
return n;
}
LinkListNode* MyLkList::GetLinkList(int i)
{
int j = 0;
LinkListNode *p = pHead;
if(i == 0)
return nullptr;
if(j<i && p->pNext != nullptr)
{
j++;
p = p->pNext;
}
if( j == i)
return p;
else
return nullptr;
}
LinkListNode* MyLkList::LocateLinkList(int objData)
{
LinkListNode* p = pHead->pNext;
while(p != nullptr && p->data != objData)
{
p = p->pNext;
}
//这里出循环只有两种情况
//1、p为nullpr整个链表结束了,此时p为nullptr
//2、p的data就是我们找的数据,此时返回节点p
return p;
}
LinkListNode* MyLkList::Create_rear_LkList(int arr[],int length)
{
LinkListNode* p=nullptr,*q=nullptr;
p = pHead;
for(int i=0;i<length;i++)
{
q = static_cast<LinkListNode*>(malloc(sizeof(LinkListNode)));
q->data = arr[i];
p->pNext = q;
p = q;
}
p->pNext = nullptr;
//最后节点的next域置为空
return pHead;
}
void MyLkList::Insert_After_LkList(LinkListNode* ptr,int x)
{
LinkListNode* s = nullptr;
s = static_cast<LinkListNode*>(malloc(sizeof(LinkListNode)));
s->data = x;
s->pNext = ptr->pNext;
ptr->pNext = s;
}
void MyLkList::Insert_Before_LkList(LinkListNode *ptr,int x)
{
LinkListNode* s= nullptr,*p=nullptr;
s = static_cast<LinkListNode*>(malloc(sizeof(LinkListNode)));
s->data =x;
p = pHead;
while(p->pNext != ptr)
{
p = p->pNext;
}
s->pNext = ptr;
p->pNext =s;
}
LinkListNode* MyLkList::Del_LkList(LinkListNode* ptr)
{
LinkListNode* fptr = nullptr;
fptr = ptr->pNext;
ptr->pNext = fptr->pNext;
return fptr;
}
void MyLkList::Dis_LkList()
{
LinkListNode* p=pHead->pNext;
while(p != nullptr)
{
std::cout<<p->data<<" ";
p=p->pNext;
}
std::cout<<"****************"<<std::endl;
}
然后就可在主函数中测试自己代码实现的操作了。