分为三个文件
一个LinkList_test.h头文件,用于设定链表节点结构体,以及功能函数名称,存储内容结构体。
一个LinkList.cpp文件,用于实现各类功能函数。
一个main.cpp文件,用于运行。
IDE:CodeBlocks
LinkList.h
using namespace std;
struct Info //存储数据结构体
{
int data;
};
struct Node
{
Info val;
Node *next;
Node(Info x):val(x),next(NULL){}//设定初始值
};
class LinkList
{
public:
//构造
void Creat();
//在链表头部插入结点
void InsertHead(Info val);
//插入结点
void Insert(Info val,int pos);
//删除结点
void Remove(Info val);
//得到链表长度
int Length();
//链表反序
void Reverse();
//查找结点位置
int Find(Info val);
//打印链表
void Print();
//析构函数
~LinkList();
private:
Node *head;
int length;
};
LinkList.cpp
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "LinkList_test.h" //注意要用双引号
using namespace std;
//构造函数
void LinkList::Creat()
{
head = (Node *)malloc(sizeof(Node));
length = 10;
Node *s;
s = (Node *)malloc(sizeof(Node));
Node *q;
q = (Node *)malloc(sizeof(Node));
Node *temp;
s = head;
head->next = q;
for(int i=1; i<=length; ++i)
{
if(i == 1)
{
s->val.data = i;
continue;
}
temp = (Node *)malloc(sizeof(Node));
temp->val.data = i;
s->next = temp;
s = temp;
}
temp->next = NULL;
}
//析构函数
LinkList::~LinkList()
{
Node *temp;
for(int i=0; i<length; ++i)
{
temp = head;
head = head->next;
delete temp;
}
}
//链表长度
int LinkList::Length()
{
return length;
}
//插入数据
void LinkList::Insert(Info val,int pos)
{
Node *index = head;
if(pos == 1)
{
Node *temp = new Node(val);
temp->next = head;
head = temp;
length++;
}
if(pos > 1)
{
int i = 1;
while(i < pos)
{
index = index->next;
i++;
}
Node *temp = new Node(val);
temp->next = index->next;
index->next = temp;
length++;
}
}
//查找数据位置
int LinkList::Find(Info val)
{
Node *index = head;
int pos = 1;
while(index)
{
if(val.data == index->val.data)
{
cout<<"Find in No."<<pos<<endl;
return pos;
}
index = index->next;
pos++;
}
return 0;
}
//删除数据
void LinkList::Remove(Info val)
{
int pos = Find(val);
if(pos)
{
Node *index = head;
if(pos == 1 && length != 1)
{
head = head->next;
delete index;
length--;
}
if(pos != 1 && pos != length)
{
int i = 1;
while(i < pos-1)
{
index = index->next;
i++;
}
Node *temp = index->next;
index->next = index->next->next;
delete temp;
length--;
}
if(pos == length)
{
int i = 1;
while(i < pos-1)
{
index = index->next;
i++;
}
delete index->next;
index->next = NULL;
length--;
}
Remove(val);
}
else
cout<<"已无此数据"<<endl;
}
//链表反序
void LinkList::Reverse()
{
Node *q = head;
Node *p = head->next;
Node *temp = NULL;
head-> next = NULL;
while(p)
{
temp = p->next;
p->next = q;
q = p;
p = temp;
}
head = q;
}
//打印链表
void LinkList::Print()
{
Node *cursor = head;
while(cursor)
{
cout<<cursor->val.data<<endl;
cursor = cursor->next;
}
}
main.cpp
// main.cpp : 测试链表功能。
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <string>
#include "LinkList_test.h"
using namespace std;
int main()
{
LinkList head;
head.Creat();
cout<<"The LinkedList is:"<<endl;
head.Print();
Info val01;
val01.data = 7;
//插入测试
cout<<"Insert test:"<<endl;
head.Insert(val01,1);
head.Print();
//测试反序功能
cout<<"reverse test:"<<endl;
head.Reverse();
cout<<"reversed linklist is:"<<endl;
head.Print();
//测试删除功能
cout<<"remove test:"<<endl;
cout<<"the length of linklist is:"<<endl;
cout<<head.Length()<<endl;
head.Remove(val01);
cout<<"after remove:"<<endl;
head.Print();
return 0;
}
参考博客:https://blog.youkuaiyun.com/kevin_zhai/article/details/50494020
但Kevin的博客中有部分代码有误