问题描述
链表是C++中比较有特色的一种数据结构,同时思想较为简单,用处也比较多。然而,实现单链表却是很多C++初学者比较头疼的一件事,本文撰写了一些单链表的基本操作,主要包括:
- 创建链表(正序)
- 创建链表(逆序)
- 输出链表内容
- 删除指定位置的链表结点
- 删除指定值的链表结点
- 得到链表长度
- 链表反转
- 判断两个链表是否相等
- 在指定位置插入链表的新结点
小伙伴们需要自取,有帮助的话可以点个赞~
注:本文中提供的代码均为完整代码,放入C++工程后可直接运行。
代码实现:
用C++类(class)实现,共包含三个文件:
- linklist.h 函数体声明
- linklist.cpp 函数实现
- main.cpp 测试代码
文件一 linklist.h:
#ifndef LINKLIST_H
#define LINKLIST_H
#include<iostream>
using namespace std;
struct Node {
char value;
Node *next;
Node() :next(NULL) {}; //创建结构体,并为next初始化
};
class LinkList {
public:
Node* createAtBack(Node*,string); //正序创建链表
Node* createAtFront(Node*, string); //逆序创建链表
void getLength(Node*); //得到链表长度
void getValue(Node*, int); //找到在第i处的值
void search(Node*, char); //找到值value的位置
Node* deleteByIndex(Node*,int); //删除指定位置的节点
Node* deleteByValue(Node*, char); //删除指点值的节点
Node* reverse(Node*); //链表反转
Node* insert(Node*, int, int); //链表插入
void display(Node*); //输出链表
bool isEqual(Node*, Node*); //判断是否相等
};
#endif // !LINKLIST_H
文件二 linklist.cpp
#include<iostream>
#include"LinkList.h"
using namespace std;
Node* LinkList::createAtBack(Node *head,string a)
{
Node *temp;
Node *p;
p = head;
for (int i = 0; i < a.length(); i++)
{
temp = new Node;
temp->value = a[i];
p->next = temp;
p = temp;
}
return head;
}
//基本不用
Node* LinkList::createAtFront(Node *head, string a)
{
Node *temp;
Node *p;
p = head;
for (int i = 0; i < a.length(); i++)
{
temp = new Node;
temp->value = a[i];
temp->next = p->next;
p->next = temp;
}
return head;
}
void LinkList::display(Node *head)
{
Node *temp;
temp = head->next;
while (temp!=NULL)
{
cout << temp->value << "";
temp = temp->next;
}
cout << endl;
}
void LinkList::getLength(Node* head)
{
Node* temp;
temp = head;
int j = 0;
while(temp != NULL)
{
temp = temp->next;
j++;
}
cout << "链表长度为" << j - 1 << endl;
}
void LinkList::getValue(Node* head, int i)
{
Node *temp;
temp = head;
int j = 0;
while (temp!=NULL)
{
if (j < i - 1)
{
temp = temp->next;
j++;
}
else
{
cout << "在第" << i << "处的是" << temp->next->value;
break;
}
}
cout << endl;
}
void LinkList::search(Node*head, char value)
{
Node *temp;
temp = head->next;
int j = 0;
while (temp != NULL)
{
if (temp->value != value)
{
j++;
temp = temp->next;
}
else
{
cout << value << "在第" << j + 1 << "个位置";
break;
}
}
if (temp == NULL)
{
cout << "找不到!";
}
cout << endl;
}
Node * LinkList::deleteByIndex(Node*head, int i)
{
Node* temp;
temp = head;
int j = 0;
while (temp!=NULL)
{
if (j < i - 1)
{
j++;
temp = temp->next;
}
else
{
Node* s;
s = new Node;
s = temp->next;
temp->next = s->next;
delete s;
break;//记得加break
}
}
return head;
}
Node *LinkList::deleteByValue(Node*head, char value)
{
Node* temp;
temp = head;
while (temp->next!=NULL)
{
if (temp->next->value!=value)
{
temp = temp->next;
}
else
{
Node *s;
s = new Node;
s = temp->next;
temp->next = s->next;
delete s;
break;
}
}
return head;
}
Node *LinkList::insert(Node* head, int i,int value)
{
Node *temp;
temp = head;
int j = 0;
while (temp!=NULL)
{
if (j < i - 1)
{
j++;
temp = temp->next;
}
else
{
Node *s;
s = new Node;
s->value = value;
s->next = temp->next;
temp->next = s;
break;
}
}
return head;
cout << endl;
}
Node* LinkList::reverse(Node* head)
{
Node* p;
Node* q;
Node* t = NULL;
p = head;
if (p->next == NULL || p->next->next == NULL)
{
return head;
}
else
{
p = head->next;
q = head->next->next;
while (q!=NULL)
{
t = q->next;
q->next = p;
p = q;
q = t;
}
head->next->next = NULL;
head->next = p;
}
return head;
cout << endl;
}
bool LinkList::isEqual(Node* head1, Node* head2)
{
Node* temp1;
Node* temp2;
temp1 = head1->next;
temp2 = head2->next;
while (temp1 != NULL && temp2 != NULL)
{
if (temp1->next->value == temp2->next->value)
{
temp1 = temp1->next;
temp2 = temp2->next;
}
else
{
return 0;
}
}
if (temp == NULL && temp2 != NULL)
{
return 0;
}
if (temp != NULL && temp2 == NULL)
{
return 0;
}
return 1;
}
文件三 main.cpp
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#include"LinkList.h"
using namespace std;
int main()
{
string a[3] = { "abc","xczx","ccc" };
Node * head;
vector<Node*>list;
vector<string>word(a, a + 3);
LinkList linkList;
for (int i = 0; i < word.size(); i++)
{
head = new Node;
list.push_back(linkList.createAtBack(head,word[i]));
}
for (int i = 0; i < word.size(); i++)
{
linkList.display(list[i]);
}
cout << endl;
for (int i = 0; i < word.size(); i++)
{
linkList.getLength(list[i]);
}
cout << endl;
for (int i = 0; i < word.size(); i++)
{
linkList.getValue(list[i],1);
}
cout << endl;
for (int i = 0; i < word.size(); i++)
{
linkList.search(list[i], 'a');
}
cout << endl;
for (int i = 0; i < word.size(); i++)
{
linkList.deleteByIndex(list[i], 1);
}
for (int i = 0; i < word.size(); i++)
{
linkList.display(list[i]);
}
cout << endl;
for (int i = 0; i < word.size(); i++)
{
linkList.deleteByValue(list[i], 'b');
}
for (int i = 0; i < word.size(); i++)
{
linkList.display(list[i]);
}
cout << endl;
for (int i = 0; i < word.size(); i++)
{
linkList.insert(list[i], 1,'b');
}
for (int i = 0; i < word.size(); i++)
{
linkList.display(list[i]);
}
cout << endl;
for (int i = 0; i < word.size(); i++)
{
linkList.reverse(list[i]);
}
for (int i = 0; i < word.size(); i++)
{
linkList.display(list[i]);
}
cout << endl;
linkList.insert(list[0], 1, 'c');
cout << linkList.isEqual(list[0], list[1]) << endl;
cout << linkList.isEqual(list[0], list[2]) << endl;
system("pause");
return 0;
}