最近面试的时候发现自己手写代码的能力极差。握住笔之后整个脑子都是木的,什么都写不出来。于是准备重新整理一下基础数据结构的实现。
定义LinkList.h文件
#ifndef LIST_LINKLIST_H
#define LIST_LINKLIST_H
#endif //LIST_LINKLIST_H
// 定义链表节点和方法
#include<string>
using namespace std;
typedef int DataType;
//定义节点
class Node
{
public:
int value;
Node* next;
};
//定义单链表
class LinkList {
public:
//构建单链表
LinkList();
//销毁单链表
~LinkList();
//创建一个单链表
void CreateLinkList(int n);
//打印链表
void Print();
//获取线性表长度
int GetLength();
//判断单链表是否为空
bool IsEmpty();
//查找节点
Node *FindNode(DataType data);
//在链表尾部插入指定元素
void InsertElemAtEnd(DataType data);
//在链表指定位置插入指定元素
void InsertElemAtIndex(DataType data, int n);
//在链表头部插入指定元素
void InsertElemAtHead(DataType data);
//删除尾部元素
void DeleteElemAtEnd();
//删除指定元素
void DeleteElemAtIndex(DataType data);
//删除头部元素
void DeleteElemAtHead();
private:
Node* head;
};
linklist.cpp
#include "linklist.h"
#include <iostream>
#define MaxSize 100000
using namespace std;
//单链表构造函数
LinkList::LinkList() {
head = new Node;
head->value = 0;
head->next = NULL;
}
//单链表析构函数
LinkList::~LinkList() {
delete head;
}
//创建单链表
void LinkList::CreateLinkList(int n) {
Node *p,*temp;
temp = head;
if(n<0 || n>MaxSize){
cout<<"结点个数有误"<<endl;
}
cout<<"输入元素"<<endl;
for(int i=0;i<n;i++){
p= new Node;
cin>>p->value;
p->next = NULL;
temp->next = p;
temp = p;
}
}
//打印链表
void LinkList::Print() {
if (head == NULL || head->next == NULL) {
std::cout << "链表为空表" << std::endl;
}
cout << "链表中的数据依次为:";
Node *p = head->next;
while (p != NULL) {
cout << p->value << " ";
p = p->next;
}
}
//获取线性表长度
int LinkList::GetLength()
{
int count = 0;
Node *p = head->next;
while (p != NULL)
{
count++;
p = p->next;
}
return count;
}
//判断单链表是否为空
bool LinkList::IsEmpty()
{
if (head->next == NULL)
return true;
else
return false;
}
//查找结点
Node *LinkList::FindNode(DataType data) {
Node *p = head->next;
if(p==NULL){
cout<<"链表为空"<<endl;
return NULL;
}else{
while(p!=NULL){
if(p->value == data){
return p;
}
p=p->next;
}
return NULL;
}
}
//在链表尾部插入元素
void LinkList::InsertElemAtEnd(DataType data) {
Node *newNode = new Node;
newNode->value = data;
Node *p=head;
if(head->next == NULL){
head->next = newNode;
newNode->next = NULL;
}else {
while (p->next != NULL) {
p = p->next;
}
p->next = newNode;
newNode->next=NULL;
}
}
//在头部插入元素
void LinkList::InsertElemAtHead(DataType data) {
Node *newNode = new Node;
newNode->value = data;
Node *p = head;
newNode ->next = p->next;
p->next = newNode;
}
//在链表指定位置插入元素
void LinkList::InsertElemAtIndex(DataType data, int n) {
if(n<0||n>GetLength()){
cout<<"插入位置错误"<<endl;
}else{
Node *newNode = new Node;
newNode->value=data;
Node *p =head;
int i=1;
while(n>i){
p = p->next;
i++;
}
newNode->next = p->next;
p->next = newNode;
}
}
//删除尾部元素
void LinkList::DeleteElemAtEnd() {
Node *p = head;
Node *temp = NULL;
if(head == NULL){
cout<<"链表为空"<<endl;
}else{
while(p->next != NULL){
temp = p;
p=p->next;
}
delete p;
p =NULL;
temp ->next = NULL;
}
}
//删除头部元素
void LinkList::DeleteElemAtHead() {
Node *p=head;
if(p ==NULL || p->next ==NULL){
cout<<"链表为空"<<endl;
}else{
Node *temp = NULL;
p = p->next;
temp = p->next;
delete p;
p = NULL;
head->next = temp;
}
}
//删除指定元素
void LinkList::DeleteElemAtIndex(DataType data) {
Node *temp = FindNode(data);
if(temp == head->next){
DeleteElemAtHead();
}else{
Node *p = head;
while (p->next != temp){
p = p->next;
}
p->next= temp->next;
delete temp;
temp = NULL;
}
}