• 链表练习题


    本文是关于链表的一些操作(包括单链表和双向循环链表) 
    1、单链表,双链表的创建。 
    2、单链表和双链表的打印。 
    3、单链表的插入,删除。 
    4、双链表的插入和删除。 
    5、单链表的逆置。 
    6、单链表节点的个数。 
    7、单链表,双链表的查找。 

    函数源码:

      1 //链表相关问题
      2 
      3 typedef int DataType;
      4 typedef struct LinkNode  //单链表结构
      5 {
      6     struct LinkNode* next;
      7     DataType data;
      8 }LinkNode;
      9 
     10 LinkNode *CreateNode(DataType x) //创建单链表节点
     11 {
     12     LinkNode *tmp = (LinkNode *)malloc(sizeof(LinkNode));
     13     if (NULL == tmp)
     14     {
     15         printf("分配内存失败!
    ");
     16         return NULL;
     17     }
     18     tmp->next=NULL;
     19     tmp->data=x;
     20     return tmp;
     21 }
     22 
     23 void PrintLinkList(LinkNode *phead)  //单链表打印
     24 {
     25     while (phead)
     26     {
     27         printf("%d ",phead->data);
     28         phead = phead->next;
     29     }
     30     printf("
    ");
     31 }
     32 
     33 void InsertLinkList(LinkNode **phead,LinkNode *pos,DataType x)  //单链表插入
     34 {
     35     LinkNode *newNode,*tmp = *phead;
     36     assert(phead);
     37     if (NULL==*phead)
     38     {
     39         *phead = CreateNode(x);
     40         return;
     41     }
     42     while(*phead != pos)
     43     {
     44         tmp = *phead;
     45         *phead = (*phead)->next;
     46     }
     47     newNode = CreateNode(x);
     48     newNode->next = tmp->next;
     49     tmp->next = newNode;
     50 }
     51 
     52 size_t ListNodeCount(LinkNode* phead) //计算单链表的节点数
     53 {
     54     size_t count = 0;
     55     while (phead)
     56     {
     57         count++;
     58         phead = phead->next;
     59     }
     60     return count;
     61 }
     62 
     63 LinkNode *LinkListSearch(LinkNode *phead,DataType x)  //在单链表中查找一个数
     64 {
     65     while(phead)
     66     {
     67         if (phead->data == x)
     68             return phead;
     69         phead = phead->next;
     70     }
     71     return NULL;
     72 }
     73 
     74 LinkNode *ReverseLinkList(LinkNode *phead)  //单链表的逆置
     75 {
     76     LinkNode *first = phead;
     77     LinkNode *cur = first->next;
     78     first->next=NULL;
     79 
     80     while (cur)
     81     {
     82         LinkNode *tmp = cur->next;
     83         cur->next = first;
     84         first = cur;
     85         cur = tmp;
     86     }
     87     return first;
     88 }
     89 
     90 size_t RemoveLinkList(LinkNode **phead,LinkNode *pos)  //单链表任意节点删除
     91 {
     92     LinkNode *first = *phead;
     93     while (first)
     94     {
     95         if (*phead == pos) //删头节点
     96         {
     97             *phead = first->next;
     98             free(pos);
     99             pos = NULL;
    100             return 1;
    101         }
    102         else if (first->next == pos) //非头节点情况
    103         {
    104             first->next = pos->next;
    105             free(pos);
    106             pos = NULL;
    107             return 1;
    108         }
    109         first = first->next;
    110     }
    111     return 0;
    112 }
    113 
    114 typedef struct DoubleLinkList  //双链表结构
    115 {
    116     DataType data;
    117     struct DoubleLinkList *prev;
    118     struct DoubleLinkList *next;
    119 }DoubleList;
    120 
    121 DoubleList *CreateDoubleList(DataType x) //创建双链表节点
    122 {
    123     DoubleList *newNode = (DoubleList *)malloc(sizeof(DoubleList));
    124     assert(newNode);
    125     newNode->next = NULL;
    126     newNode->prev = NULL;
    127     newNode->data = x;
    128     return newNode;
    129 }
    130 
    131 void PrintDoubleList(DoubleList *phead)  //打印双链表
    132 {
    133     DoubleList *tmp = phead;
    134     while (tmp)
    135     {
    136         printf("%d ",tmp->data);
    137         tmp = tmp->next;
    138         if (tmp == phead)
    139             break;
    140     }
    141     printf("
    ");
    142 }
    143 
    144 DoubleList *DoubleListSearch(DoubleList *phead,DataType x)  //双链表查找
    145 {
    146     DoubleList *tmp = phead;
    147     while (phead)
    148     {
    149         if (phead->data == x)
    150             return phead;
    151         if (tmp == phead->next)
    152             break;
    153         phead = phead->next;
    154     }
    155     return NULL;
    156 }
    157 
    158 void DoubleListInsert(DoubleList **phead, DataType x) //双链表的头插
    159 {
    160     DoubleList *tmp = (*phead);
    161     DoubleList *newNode = CreateDoubleList(x);
    162 
    163     if (NULL == *phead)
    164     {
    165         *phead = newNode;
    166         (*phead)->next = *phead;
    167         (*phead)->prev = *phead;
    168     }
    169     else 
    170     {
    171         newNode->next = (*phead)->next;
    172         (*phead)->next = newNode;
    173         newNode->prev = *phead;
    174         newNode->next->prev = newNode;
    175     }
    176 }
    177 
    178 
    179 size_t RemoveDoubleListNode(DoubleList **phead,DataType x)  //删除双链表节点
    180 {
    181     DoubleList *tmp = *phead;
    182     while (*phead)
    183     {
    184         if (tmp->data == x)
    185         {
    186             tmp->prev->next = tmp->next;
    187             tmp->next->prev = tmp->prev;
    188             if (tmp->data == (*phead)->data)
    189                *phead = tmp->next;
    190             if ((*phead)->next == *phead)
    191             {
    192                 free(*phead);
    193                 *phead = NULL;
    194             }
    195             free(tmp);
    196             tmp = NULL;
    197             return 1;
    198         }
    199         if (*phead == tmp->next)
    200             break;
    201         tmp = tmp->next;
    202     }
    203     return 0;
    204 }

    csdn博客地址: http://blog.csdn.net/qq_38646470

  • 相关阅读:
    【数据结构】线性表&&顺序表详解和代码实例
    【智能算法】超详细的遗传算法(Genetic Algorithm)解析和TSP求解代码详解
    【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
    【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解
    10. js时间格式转换
    2. 解决svn working copy locked问题
    1. easyui tree 初始化的两种方式
    10. js截取最后一个斜杠后面的字符串
    2. apache整合tomcat部署集群
    1. apache如何启动
  • 原文地址:https://www.cnblogs.com/zhonglongbo/p/8366714.html
Copyright © 2020-2023  润新知