• 链表的基本操作


    链表数据结构的定义:由于链表一方面需要在节点中存储数据,另一方面还需要存储"线索",因此,通常采用结构体定义链表节点数据类型。

     

     1 struct Node;
     2 typedef struct Node *PtrToNode;
     3 typedef PtrToNode List;
     4 typedef PtrToNode Position;
     5 typedef int ElementType;
     6 struct Node 
     7 {
     8     ElementType Element;
     9     Position Next;
    10 };

    基本操作:

     1 //创建链表
     2 List CreateList();
     3 //遍历链表
     4 void TraverseList(List L);
     5 //清空链表
     6 List MakeEmpty(List L);
     7 //判断给定列表是否为空
     8 int IsEmpty(List L);
     9 //判断节点在给定链表中是否为空
    10 int IsLast(Position P, List L);
    11 //在指定的链表中查找给定元素。
    12 //存在则返回其第一次出现的位置,不存在则返回NULL
    13 Position Find(ElementType X, List L);
    14 //删除链表中的某个元素
    15 void Delete(ElementType X, List L);
    16 //在指定链表中查找给定元素的前驱节点
    17 Position FindPrevious(ElementType X, List L);
    18 //在链表给定位置的后面插入元素
    19 void Insert(ElementType X, List L, Position P);
    20 //删除链表
    21 void DeleteList(List L);
    22 //返回链表的头结点
    23 Position Header(List L);
    24 //返回链表第一个数据元素节点
    25 Position First(List L);
    26 //返回当前位置的下一个位置
    27 Position Advance(Position P);
    28 //获取当前位置元素的值
    29 ElementType Retrive(Position P);

     

     实现:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 struct Node;
      5 typedef struct Node *PtrToNode;
      6 typedef PtrToNode List;
      7 typedef PtrToNode Position;
      8 typedef int ElementType;
      9 struct Node 
     10 {
     11     ElementType Element;
     12     Position Next;
     13 };
     14 
     15 //创建链表
     16 List CreateList();
     17 //遍历链表
     18 void TraverseList(List L);
     19 //清空链表
     20 List MakeEmpty(List L);
     21 //判断给定列表是否为空
     22 int IsEmpty(List L);
     23 //判断节点在给定链表中是否为空
     24 int IsLast(Position P, List L);
     25 //在指定的链表中查找给定元素。
     26 //存在则返回其第一次出现的位置,不存在则返回NULL
     27 Position Find(ElementType X, List L);
     28 //删除链表中的某个元素
     29 void Delete(ElementType X, List L);
     30 //在指定链表中查找给定元素的前驱节点
     31 Position FindPrevious(ElementType X, List L);
     32 //在链表给定位置的后面插入元素
     33 void Insert(ElementType X, List L, Position P);
     34 //删除链表
     35 void DeleteList(List L);
     36 //返回链表的头结点
     37 Position Header(List L);
     38 //返回链表第一个数据元素节点
     39 Position First(List L);
     40 //返回当前位置的下一个位置
     41 Position Advance(Position P);
     42 //获取当前位置元素的值
     43 ElementType Retrive(Position P);
     44 
     45 int IsEmpty(List L)
     46 {
     47     
     48     return L->Next == NULL;
     49 }
     50 
     51 int IsLast(Position P, List L)
     52 {
     53     return P->Next == NULL;
     54 }
     55 
     56 Position Find(ElementType X, List L)
     57 {
     58     Position P = L->Next;
     59     while(P != NULL && P->Element != X)
     60     {
     61         P = P->Next;
     62     }
     63     return P;
     64 }
     65 
     66 void Delete(ElementType X, List L)
     67 {
     68     Position P,TmpCell;
     69     P = FindPrevious(X,L);    
     70     if(!IsLast(P,L))
     71     {
     72         TmpCell = P->Next;
     73         P->Next = TmpCell->Next;
     74         free(TmpCell);
     75     }
     76 }
     77 
     78 Position FindPrevious(ElementType X, List L)
     79 {
     80     Position P = L;
     81     while(P->Next != NULL && P->Next->Element != X)
     82     {
     83         P = P->Next;
     84     }
     85     return P;
     86 }
     87 
     88 void Insert(ElementType X, List L, Position P)
     89 {
     90     Position TmpCell;
     91     TmpCell = malloc(sizeof(struct Node));
     92     if(TmpCell == NULL)
     93     {
     94         printf("Out of space!
    ");
     95         return;
     96     }
     97     TmpCell->Element = X;
     98     TmpCell->Next = P->Next;
     99     P->Next = TmpCell;
    100 }
    101 
    102 void DeleteList(List L)
    103 {
    104     Position P,Tmp;
    105     P = L->Next;
    106     L->Next = NULL;
    107     while(P != NULL)
    108     {
    109         Tmp = P->Next;
    110         free(P);
    111         P = Tmp;
    112     }
    113 }
    114 
    115 Position Header(List L)
    116 {
    117     return L;
    118 }
    119 
    120 Position First(List L)
    121 {
    122     return L->Next;
    123 }
    124 
    125 Position Advance(Position P)
    126 {
    127     return P->Next;
    128 }
    129 
    130 ElementType Retrive(Position P)
    131 {
    132     return P->Element;
    133 }
    134 
    135 List CreateList()
    136 {
    137     int i;
    138     Position P,Tmp;
    139     List L = malloc(sizeof(struct Node));
    140     P = L;
    141     for(i = 0; i < 5; i++)
    142     {
    143         Tmp = malloc(sizeof(struct Node));
    144         Tmp->Element = i;
    145         P->Next = Tmp;
    146         P = Tmp;        
    147     }
    148     P->Next = NULL;
    149     return L;
    150 }
    151 
    152 void TraverseList(List L)
    153 {
    154     Position P;
    155     P = L->Next;
    156     while(P != NULL)
    157     {
    158         printf("%d
    ",P->Element);    
    159         P = P->Next;
    160     }
    161 }
    162 
    163 int main(void)
    164 {
    165     //创建链表
    166     List L = CreateList();
    167     //查找元素1在链表中的位置
    168     Position P = Find(1,L);
    169     //在元素1后面插入元素8
    170     Insert(8,L,P);
    171     //查找元素8前驱结点
    172     P = FindPrevious(8,L);
    173     //遍历链表
    174     TraverseList(L);
    175     return 0;
    176 }

     

     

    原文链接

     

  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/xjtuchenpeng/p/4977943.html
Copyright © 2020-2023  润新知