第三章 链表

来源:互联网 发布:java的oa项目 编辑:程序博客网 时间:2024/06/06 04:34

1 链表

链表描述

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。在学完C语言这门课的时候,我们所做的课程设计也经常是用链表写的各种管理系统。链表可以说是指针的一个经典应用。链表是最简单的数据结构之一,节点中只有一个指针域叫做单链表,两个指针域叫做双链表,如果最后一个节点的next指针指向头节点,则为循环链表。
有些语言如BASIC,FORTRAN等是不支持指针的,如果需要链表又不能使用指针,那么就必须使用另外的方法实现。这种方法称为 游标(cursor) 方法。具体请百度,本文并不涉及。
要用好链表的话,务必熟悉malloc,free等操作,因为新手一不留神就会造成内城泄露。

链表ADT

#ifndef _List_Hstruct Node;typedef struct Node *PtrNode;typedef PtrNode List;typedef PtrNode Position;List MakeEmpty(List L);int IsEmpty(List L);Position Find(int X, List L);int IsLast(Position P, List L);void Delete(int X, List L);Position FindPrevious(int X, List L);void Insert(int X, List L, Position P);void DeleteList(List L);Position Header(List L);Position First(List L);Position Advance(Position P);int Retrieve(Position p);#endif

#include <iostream>#include "list.h"using namespace std;struct Node{int Data;Position Next;};int IsEmpty(List L){return L->Next == NULL;}int IsLast(Position P, List L){return P->Next == NULL;}Position FindPrevious(int X, List L){Position P;P = L;while (P->Next != NULL && P->Next->Data != X)P = P->Next;return P;}void Delete(int X, List L){Position P, Tmp;P = FindPrevious(X, L);if (!IsLast(P, L)){Tmp = P->Next;P->Next = Tmp->Next;free(Tmp);}}void Insert(int X, List L, Position P){Position Tmp;Tmp = (Position)malloc(sizeof(Node));if(Tmp == NULL)cout<<"Out of Space"<<endl;Tmp->Data = X;Tmp->Next = P->Next;P->Next = Tmp;}void DeleteList(List L){Position P, Tmp;P = L->Next;L->Next = NULL;while (P != NULL){Tmp = P->Next;free(P);P = Tmp;}}Position Find(int X, List L){Position P;P = L->Next;while(P != NULL && P->Data != X)P = P->Next;return P;}List MakeEmpty(List L){return L;}


链表的应用

基数排序(radix sort)的前身是桶子排序(bucket sort)--比如说,有N个数,他们的范围都是0到M-1,那么我们可以申请一个array[M]的数组,依此检索这N个数,碰到为i的数 ,就让array[i]++,这样检索完成后,再检索array数组便知道排序情况了。
而一次基数排序是分为多次桶子排序  , 它 的时间复杂度是 O(P(M+N))    P:经过桶子排序的次数    M:桶的个数   N: 待排序数的个数

void RadixSort(int a[], int n)//这里我们为了方便,假设数组中的数据最高多为三位数{                                   //用C++ 的list容器list<int> bucket[10];for (int i=0; i < 3; i++)//一共进行3次桶子排序{for (int j=0; j < n; j++){int tmp = a[j];for(int k = 0; k < i; k++)tmp /= 10;tmp %= 10;bucket[tmp].push_back(a[j]);}int k = 0;for (int j=0; j < 10; j++)//10个桶{while (!bucket[j].empty()){a[k++] = bucket[j].front();bucket[j].pop_front();}}cout<<"第"<<i + 1<<"次桶子排序结果: ";for(int j=0; j<10; j++) cout<<a[j]<<" ";cout<<endl;}}



0 0