List链表的基本功能结构体实现
这里直接以插入排序和归并排序的代码来介绍单向链表:
1 //结构体实现链表 插入排序 2 struct Node{ 3 int value; 4 Node *next; 5 //Node *prev; //双向链表 6 Node *head = NULL; //NULL表示一个空节点,实际上是一个定义在标准库中值为0的常量 7 } a[1001],*head; 8 9 //在p节点后插入now节点 10 void Insert(Node *p,Node *now){ 11 now->next = p->next; 12 p->next = now; 13 return; 14 } 15 //删除now节点 16 void Delete(Node *p,Node *now){ 17 p->next = now->next; 18 now->next = NULL; //这句可以不写 19 return; 20 } 21 22 int main(){ 23 ios; 24 int n; 25 cin >> n; 26 for (int i = 1; i <= n; i++){ 27 cin >> a[i].value; 28 if (head == NULL || a[i].value < head->value){ 29 a[i].next = head; 30 head = &a[i]; 31 } 32 else{ 33 for (Node *p = head; p != NULL ; p = p->next){ 34 if (p->value < a[i].value && (p->next == NULL || a[i].value < p->next->value)){ 35 Insert(p,&a[i]); 36 break; 37 } 38 } 39 } 40 } 41 for (Node *p = head;p;p = p->next){ 42 cout << p->value << " "; 43 } 44 return 0; 45 }
1 //归并排序 2 struct Node{ 3 int value; 4 Node *next; 5 } a[100001],b[100001],*h1,*h2; 6 7 int n,m; 8 9 Node *Merge(Node *h1, Node *h2){ 10 Node *p1 = h1, *p2 = h2; 11 Node *ans = NULL, *t = NULL; 12 while(p1 || p2){ 13 if (p1 && (p2 == NULL || p1->value < p2->value)){ 14 if (ans == NULL){ 15 ans = t = p1; 16 } 17 else{ 18 t->next = p1; 19 t = p1; 20 } 21 p1 = p1->next; 22 } 23 else{ 24 if (ans == NULL){ 25 ans = t = p2; 26 } 27 else{ 28 t->next = p2; 29 t = p2; 30 } 31 p2 = p2->next; 32 } 33 } 34 return ans; 35 } 36 37 38 int main(){ 39 //ios; 40 cin >> n >> m; 41 h1 = h2 = NULL; 42 Node *t1 = NULL; 43 Node *t2 = NULL; 44 for (int i = 1;i <= n;i++){ 45 cin >> a[i].value; 46 if (h1 == NULL){ 47 h1 = &a[i]; 48 t1 = &a[i]; 49 } 50 else{ 51 t1->next = &a[i]; 52 t1 = &a[i]; 53 } 54 } 55 for (int i = 1;i <= m;i++){ 56 cin >> b[i].value; 57 if (h2 == NULL){ 58 h2 = &b[i]; 59 t2 = &b[i]; 60 } 61 else{ 62 t2->next = &b[i]; 63 t2 = &b[i]; 64 } 65 } 66 Node *p = Merge(h1,h2); 67 for (; p; p = p->next){ 68 cout << p->value << " "; 69 } 70 return 0; 71 }
双向链表:
1 //结构体实现双向链表 2 struct Node{ 3 int value; 4 Node *next; 5 Node *prev; 6 Node *head = NULL; 7 } a[1001],*head; 8 9 10 void Insert(Node *p, Node now){ 11 //在头尾插入需要特判 这里没有给出 12 Node *q = p->next; 13 p->next = now; 14 now->prev = p; 15 now->next = q; 16 q->prev = now; 17 return; 18 } 19 20 void Delete(Node *now){ 21 //当now为head || tail的时候需要特判 这里也没有给出 22 Node *p = now->prev, *q = now->next; 23 p->next = q; 24 q->prev = p; 25 return; 26 }
循环链表其实就是在单向列表的基础上 将最后一个节点的next指针指向头节点(双向同理)。
在此处就不做代码解释了。
还有一些例如邻接链表之类的其他种类的链表,由于不太常用就先写了(才不是因为懒)。
STL方法也一并给出:
1 list.begin() //返回指向第一个元素的iterator 2 list.end() //返回指向最末元素的下一个位置的iterator 3 list.empty() //空则1 4 list.size() 5 list.insert(pos[k],1)//插入到迭代器pos[k]的左边 返回一个迭代器 6 list.erase() 7 list.sort() 8 list.reverse() 9 list.remove()//删除具有指定值的元素 10 list.push_front(1);//从前面插入1
详情可见:<list> - C++ Reference (cplusplus.com)