线性表的链式存储(二)
这篇主要实现线性表最主要的功能:插入和删除元素,包括:
①根据下标索引m,找到线性表中指向该节点的指针
②头插、尾插、指定位置插入
③头删、尾删、指定位置删除
④清空线性表
头文件如下:
#pragma once
#include<iostream>
using namespace std;
class Node
{
public:
int data;
Node* next;
};
class LinkList
{
public:
LinkList();//构造函数
~LinkList();//析构函数
void Creatlist();//创建一个线性表
void Showlist();//遍历输出线性表
Node* Find_ptr(int m);//根据下标索引m,找到线性表中指向该节点的指针
void Insertelematfront(int data);//头插
void Insertelematend(int data);//尾插
void Insertelematindex(int n,int data);//在指定位置插入元素
void Deleteelematfront();//头删
void Deleteelematend();//尾删
void Deleteelematindex(int n);//删除指定位置的元素
void clearlist();//清空线性表
private:
Node* head;
};
具体实现如下:
#include<iostream>
#include<ctime>
#include"线性表的链式存储2.h"
using namespace std;
LinkList::LinkList()
{
cout << "链表的构造函数" << endl;
head=new Node;
head->data = 0;
head->next = NULL;
}
LinkList::~LinkList()
{
cout << "链表的析构函数" << endl;
delete head;
}
void LinkList::Creatlist()//创建一个线性表
{
Node* p = head;
int n = 5;
for (int i = 0; i < n; i++)
{
Node* q = new Node;//这条语句要写在循环体里面,n是几就new几个结点
q->data = rand() % 100;
p->next = q;
q->next = NULL;
p = q;//这句话是说p要一直指向链表的最后一位,方便插入元素
}
}
void LinkList::Showlist()//遍历输出线性表
{
Node* p = head;
int i = 0;
while (p->next != NULL)
{
p = p->next;//p从指向第一个结点开始遍历
cout << "第" << i + 1 << "个结点为:" << p->data << endl;
i++;
}
}
Node* LinkList::Find_ptr(int m)//根据第m个元素,找到线性表中指向该节点的指针
{
Node* p = head;
int i = 0;
while (m > i)
{
p = p->next;
i++;
}
return p;
}
void LinkList::Insertelematfront(int data)//头插
{
Node* p = head;
Node* s = new Node;
s->data = data;
s->next = p->next;
p->next = s;
}
void LinkList::Insertelematend(int data)//尾插
{
Node* p = head;
Node* s = new Node;
while (p->next != NULL)
{
p = p->next;
}
s->data = data;
s->next = NULL;
p->next = s;
}
void LinkList::Insertelematindex(int n, int data)//在指定位置插入元素
{
Node* p = head;
Node* s = new Node;
int i = 0;
if (n == 1)//相当于头插
{
s->data = data;
s->next = p->next;
p->next = s;
}
else
{
while (n > i)
{
p = p->next;
i++;
}
s->data = data;
s->next = p->next;
p->next = s;
}
}
void LinkList::Deleteelematfront()//头删
{
Node* p = head;
Node* q = p->next;
p->next = q->next;
}
void LinkList::Deleteelematend()//尾删
{
Node* p = head;
Node* q = p->next;
while (q->next != NULL)
{
q = q->next;
p = p->next;
}
p->next = NULL;
}
void LinkList::Deleteelematindex(int n)//删除指定位置的元素
{
Node* p = head;
int i = 0;
while (n > i)
{
p = p->next;
i++;
}
Node* q = p->next;
p->next = q->next;
}
void LinkList::clearlist()//清空线性表
{
Node* p = head->next;
head->next = NULL;
}
int main()
{
srand((unsigned int)time(NULL));
LinkList l;
l.Creatlist();
l.Showlist();
int n;
cout << "请输入您想查看哪个结点" << endl;
cin >> n;
Node* temp = l.Find_ptr(n);
cout<<"第"<<n << "个结点数据域存储的数据为:" << temp->data << endl;
cout << "----------------------------" << endl;
l.Insertelematfront(1998);
l.Showlist();
cout << "----------------------------" << endl;
l.Insertelematend(1997);
l.Showlist();
cout << "----------------------------" << endl;
l.Insertelematindex(2, 2021);
l.Showlist();
cout << "----------------------------" << endl;
l.Deleteelematfront();
l.Showlist();
cout << "----------------------------" << endl;
l.Deleteelematend();
l.Showlist();
cout << "----------------------------" << endl;
l.Deleteelematindex(1);
l.Showlist();
cout << "----------------------------" << endl;
l.clearlist();
l.Showlist();
cout << "----------------------------" << endl;
}
插入部分输出如下:
头插、尾插、指定位置插
删除部分输出如下:
头删、尾删、指定位置删、清空