• 链表的基本操作


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

     

     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 }

     

     

    原文链接

     

  • 相关阅读:
    javascript Literal
    [MQ]消息队列产品的功能整理
    [MQ]消息队列与企业服务总线的简单比较,MQ&ESB
    [问题记录.Dotnet]混用不同版本odp组件造成的System.MissingMethodException错误
    [问题记录.Oracle/odp.net]数据库变化通知(Database Change Notification)的使用限制
    .net 中的 json 处理
    负载均衡器/负载均衡硬件简单比较
    [笔记.zipkin]用Docker搭建zipkin-rabbitmq-mysql环境(C#客户端-zipkin4net)
    [问题记录]配置zipkin数据存储到mysql时报错Access denied for user 'root'@'172.17.0.1' (using password: NO)
    [问题记录.Centos7]解决安装teamviewer失败——提示依赖 libQt5WebKitWidgets.so.5()(64bit) >= 5.5
  • 原文地址:https://www.cnblogs.com/xjtuchenpeng/p/4977943.html
Copyright © 2020-2023  润新知