双向链表的实现
创始人
2024-02-07 07:47:37
0

这里以结构体的方式来实现链表,也可以使用类。结构体在没有修饰符的情况下,默认是共有访问。如有不对,希望能指出。


目录

一、链表和结点结构体的声明 (ListNode.h)

二、链表各个功能的实现

1、增

(1) 构造函数(创建链表头结点)

 (2) 尾插

(3) 头插

(4) 任意位置的插入

2、删

(1) 尾删

 (2) 任意位置的删除

(3) 链表释放

3、查

(1) 获取元素个数

(2) 正向打印

(3) 反向打印


一、链表和结点结构体的声明 (ListNode.h)

typedef int data_t;typedef struct ListNode {		// 结点声明data_t data;ListNode* next;ListNode* prev;
}ListNode;typedef struct SeqLinkList {SeqLinkList();void list_print();					// 从前往后打印链表void list_reverse_print();			// 从后往前打印链表size_t size();						// 链表大小(链表结点个数)int push_back(data_t val);			// 尾插void pop_back();					// 尾删int push_front(data_t val);			// 头插int list_find(data_t val);			// 查找某个结点int list_insert(int pos, data_t val);	// 在某个位置插入一个结点int list_delete(int pos);				// 删除某个位置的结点void list_destroy();					// 释放整个链表private:ListNode* _phead;					// 链表头结点的地址ListNode* _ptail;					// 链表尾结点的地址size_t _num;						// 链表元素的个数}SeqLinkList;

二、链表各个功能的实现

1、增

(1) 构造函数(创建链表头结点)

创建一个空的头结点,同时初始化元素个数

SeqLinkList::SeqLinkList() {_phead = (ListNode*)malloc(sizeof(ListNode));assert(_phead);_ptail = _phead;		// 此时头尾指向同一个地方_num = 0;		// 初始化结点的个数
}

 (2) 尾插

int SeqLinkList::push_back(data_t val) {ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (newNode == NULL)return -1;newNode->data = val;newNode->next = NULL;newNode->prev = _ptail;_ptail->next = newNode;	// 链接新的结点_ptail = newNode;		// 尾节点移动_num++;return 0;
}

(3) 头插

int SeqLinkList::push_front(data_t val) {ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (newNode == NULL)return -1;ListNode* nextNode = _phead->next;		// _phead的下一个结点newNode->data = val;newNode->next = nextNode;newNode->prev = _phead;_phead->next = newNode;if (nextNode != NULL)nextNode->prev = newNode;_num++;return 0;
}

(4) 任意位置的插入

int SeqLinkList::list_insert(int pos, data_t val) {if (pos > _num - 1)return -1;ListNode* current = _phead;while (pos-- && (current = current->next) != NULL);ListNode* nextNode = current->next;			// 记录下当前节点的下一个结点ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));if (newNode == NULL)return -1;newNode->data = val;            // 链接新的结点current->next = newNode;newNode->next = nextNode;newNode->prev = current;if (nextNode != NULL)nextNode->prev = newNode;		// 考虑尾插_num++;return 0;
}

2、删

(1) 尾删

void SeqLinkList::pop_back() {ListNode* tailNode = _ptail;		// 记录尾节点_ptail = _ptail->prev;			_ptail->next = NULL;free(tailNode);tailNode = NULL;_num--;
}

 (2) 任意位置的删除

int SeqLinkList::list_delete(int pos) {if (pos > _num - 1)return -1;ListNode* current = _phead;while (pos-- && (current = current->next) != NULL);if (current == _phead)_phead = current->next;		// 考虑头删else{ListNode* prevNode = current->prev;ListNode* nextNode = current->next;prevNode->next = nextNode;if (nextNode != NULL)nextNode->prev = prevNode;}free(current);current = NULL;_num--;return 0;
}

(3) 链表释放

void SeqLinkList::list_destroy() {_num++;			// 补上一个头结点,下面是连带着头结点一起释放了while (_phead != NULL){ListNode* lastNode = _phead;_phead = _phead->next;free(lastNode);lastNode = NULL;_num--;}
}

 

3、查

(1) 获取元素个数

size_t SeqLinkList::size() {return _num;
}

(2) 正向打印

void SeqLinkList::list_print(){ListNode* current = _phead;while ((current = current->next) != NULL){printf("%d->", current->data);}
}

(3) 反向打印

void SeqLinkList::list_reverse_print() {ListNode* current = _ptail;while (current != _phead){printf("%d->", current->data);current = current->prev;}
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...