链表:
- 链表是物理存储单元上非连续的、非顺序的存储结构,数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域
- 非连续的 指针地址
#include<iostream>
using namespace std;
typedef struct ListNode {
int data;
struct ListNode * nextListNode;
}ListNode;
class List
{
public:
List();
~List();
void PrintAllNode();
void PrintHeadAndTrail();
void InsertNodeData(int data);
void RemoveNode(int index);
private:
int maxListLength;
ListNode * headNode;
ListNode * trailNode;
ListNode * generalNode;
};
List::List(){
this->maxListLength = 0;
this->headNode = nullptr;
this->trailNode = nullptr;
this->generalNode = nullptr;
}
List::~List(){
}
void List::PrintAllNode(){
printf("%s\n", "打印:");
if ( this->headNode == 0 ) {
printf("%s\n", "======这是一个空链表======");
}else {
ListNode * listNode = nullptr;
listNode = this->headNode;
while ( listNode != 0 ) {
cout << listNode->data << " ";
listNode = listNode->nextListNode;
}
cout << endl;
}
}
void List::PrintHeadAndTrail(){
printf("%s\n", "打印头和尾:");
if ( this->headNode == 0 || this->trailNode == 0 ) {
}else {
cout << "head:" << this->headNode->data << " " << "trail:" << this->trailNode->data << endl;
}
}
void List::InsertNodeData(int data){
printf("%s:%d\n", "插入",data);
this->generalNode = (ListNode*)malloc(sizeof(ListNode));
this->generalNode->data = data;
this->generalNode->nextListNode = nullptr;
if ( this->headNode == 0 ) {
this->headNode = this->generalNode;
this->trailNode = this->generalNode;
}else {
this->trailNode->nextListNode = this->generalNode;
this->trailNode = this->generalNode;
this->maxListLength = this->maxListLength + 1;
}
}
void List::RemoveNode(int index){
printf("%s:%d\n", "移除元素下标",index);
if ( this->headNode == 0 ) {
printf("%s\n", "======这是一个空链表======");
}else if (index > this->maxListLength) {
printf("%s:%d\n", "选定下标超出链表的最大长度,链表的最大长度下标",this->maxListLength);
}else {
ListNode * listNode = nullptr;
ListNode * listNodeFront = nullptr;
ListNode * listNodeBack = nullptr;
listNode = this->headNode;
int count = 0;
while ( listNode != 0 ) {
if ( index > 0 ) {
if ( count == index-1 ) {
listNodeFront = listNode;
}
}
if ( count == index ) {
listNodeBack = listNode->nextListNode;
break;
}
listNode = listNode->nextListNode;
count = count + 1;
}
if ( index == 0 ) {
this->headNode->nextListNode = nullptr;
this->headNode = listNodeBack;
}else if ( index == this->maxListLength) {
this->trailNode = listNodeFront;
this->trailNode->nextListNode = nullptr;
} else {
listNode = listNodeFront->nextListNode;
listNode->nextListNode = nullptr;
listNodeFront->nextListNode = listNodeBack;
}
}
}
int main(int argc, char const *argv[])
{
List list;
list.InsertNodeData(7);
list.InsertNodeData(8);
list.InsertNodeData(9);
list.InsertNodeData(10);
list.InsertNodeData(11);
list.InsertNodeData(12);
list.PrintAllNode();
list.PrintHeadAndTrail();
list.RemoveNode(3);
list.PrintAllNode();
list.PrintHeadAndTrail();
return 0;
}
输出结果 - 》 》 》