最近正好在复习数据结构,链表作为比较重要的数据结构,特地自己实现了一遍。
首先我们要理解几个概念:
1、链式存储是最常用的存储方式之一,可以表示线性和非线性的数据结构。
2、按照链式存储的线性表简称为链表。
3、单链表是一种链式存取的数据结构,用一组地址任意的存储单元来存放线性表中的数据元素。
4、链表由节点构成,每个节点的构成为:元素+指针(指向后继元素)
理解这几个基本的概念之后,考虑如何链表的功能:1、初始化链表2、创建链表3、添加元素(往头部添加、往尾部添加、中间添加)4、删除元素(头删除、尾删除、中间删除)5、查找节点6、查找元素7、修改节点元素8、清空链表9、链表大小10、逆序链表
除此之外,在具体实现上为了方便起见,我们可以为链表设置一个头节点。
#include<iostream>
#include<assert.h>
using namespace std;
#define ElemType int
typedef struct ListNode
{
ElemType data;
ListNode *next;
}ListNode, *PNode;
typedef struct List
{
ListNode *first; //PNode first
ListNode *last; //PNode last
size_t size;
}List;
void InitList(List *list);
bool push_back(List *list, ElemType x);
bool push_front(List *list, ElemType x);
void ShowList(List *list);
void pop_back(List *list);
bool insert_val(List *list, ElemType x);
bool delete_val(List *list, ElemType key);
ListNode* find_key(List *list, ElemType key);
void clear_list(List *list);
void destroy_list(List *list);
void reverse_list(List *list);
void sort_list(List *list);
void InitList(List *list)
{
list->first = list->last = (ListNode*)malloc(sizeof(ListNode));
list->last->next = NULL;
assert(list->first != NULL);
list->size = 0;
}
bool push_back(List *list, ElemType x)
{
ListNode *s = (ListNode*)malloc(sizeof(ListNode));
if(s == NULL)
return false;
s->data = x;
s->next = NULL;
list->last->next = s;
list->last = s;
list->size++;
return true;
}
bool push_front(List *list, ElemType x)
{
ListNode *s = (ListNode*)malloc(sizeof(ListNode));
if(s == NULL)
return false;
s->data = x;
s->next = list->first->next;
list->first->next = s;
if(list->size == 0)
list->last = s;
list->size++;
return true;
}
void ShowList(List *list)
{
ListNode *p = list->first->next;
while(p != NULL)
{
cout<<p->data<<"-->";
p = p->next;
}
cout<<"Over."<<endl;
}
void pop_back(List *list)
{
if(list->size == 0)
return;
ListNode *p = list->first;
while(p->next != list->last)
p = p->next;
p->next = NULL;
free(list->last);
list->last = p;
list->size--;
}
bool insert_val(List *list, ElemType x)
{
ListNode *p = list->first;
while(p->next!=NULL && x>p->next->data)
p = p->next;
ListNode *s = (ListNode*)malloc(sizeof(ListNode));
if(s == NULL)
return false;
s->data = x;
s->next = NULL;
s->next = p->next;
p->next = s;
if(p == list->last)
list->last = s;
list->size++;
return true;
}
bool delete_val(List *list, ElemType key)
{
if(list->size == 0)
return false;
ListNode *p = list->first;
while(p->next!=NULL && p->next->data!=key)
p = p->next;
if(p->next == NULL)
return false;
ListNode *q = p->next;
p->next = q->next;
if(q == list->last)
list->last = p;
free(q);
list->size--;
return true;
}
ListNode* find_key(List *list, ElemType key)
{
if(list->size == 0)
return false;
ListNode *p = list->first->next;
while(p!= NULL && p->data!=key)
p = p->next;
return p;
}
void clear_list(List *list)
{
if(list->size == 0)
return;
ListNode *p = list->first->next;
while(p != NULL)
{
list->first->next = p->next;
free(p);
p = list->first->next;
}
list->last = list->first;
list->size = 0;
}
void destroy_list(List *list)
{
clear_list(list);
free(list->first);
list->first = list->last = NULL;
}
void reverse_list(List *list)
{
if(list->size <= 1)
return;
ListNode *p = list->first->next;
ListNode *q = p->next;
list->last = p;
list->last->next = NULL;
while(q != NULL)
{
p = q;
q = p->next;
p->next = list->first->next;
list->first->next = p;
}
}
void sort_list(List *list)
{
if(list->size <= 1)
return;
ListNode *p = list->first->next;
ListNode *q = p->next;
list->last = p;
list->last->next = NULL;
ListNode *t;
while(q != NULL)
{
p = q;
q = q->next;
t = list->first;
while(t->next!=NULL && p->data>t->next->data)
t = t->next;
if(t->next == NULL)
list->last = p;
p->next = t->next;
t->next = p;
}
}