• 企业版循环单链表


    //头文件:CircleLinkList.h
    1
    #pragma once 2 3 #include<stdlib.h> 4 #include<stdio.h> 5 //小链表结点 6 typedef struct CIRCLELINKNODE 7 { 8 struct CIRCLELINKNODE* next; 9 }CircleLinkNode; 10 //链表结点 11 typedef struct CIRCLELINKLIST 12 { 13 CircleLinkNode head; 14 int size; 15 }CircleLinkList; 16 17 //比较回调 18 typedef int(*COMPARENODE)(CircleLinkNode*, CircleLinkNode*); 19 //打印回调 20 typedef void(*PRINTNODE)(CircleLinkNode*); 21 //初始化 22 CircleLinkList* Init_CircleLinkList(); 23 //插入 24 void Insert_CircleLinkList(CircleLinkList* list, int pos, CircleLinkNode* value); 25 //获取第一个元素 26 CircleLinkNode* Front_CircleLinkList(CircleLinkList* list); 27 //获取最后一个元素 28 CircleLinkNode* Back_CircleLinkList(CircleLinkList* list); 29 //根据位置删除 30 void RemovePos_CircleLinkList(CircleLinkList* list, int pos); 31 //根据值删除 32 void RemoveValue_CircleLinkList(CircleLinkList* list, CircleLinkNode* value,COMPARENODE compare); 33 //获得链表长度 34 int Length_CircleLinkList(CircleLinkList* list); 35 //释放 36 void Free_CircleLinkList(CircleLinkList* list); 37 //查找 38 int Find_CircleLinkList(CircleLinkList* list, CircleLinkNode* value, COMPARENODE compare); 39 //判断是否为空 40 bool IsEmpty_Find_CircleLinkList(CircleLinkList* list); 41 //打印 42 void Print_CircleLinkList(CircleLinkList* list, PRINTNODE print);
     //头文件的实现CircleLinkList.cpp
      1#include "CircleLinkList.h"
      2 //初始化
      3 CircleLinkList* Init_CircleLinkList()
      4 {
      5     CircleLinkList* list = (CircleLinkList*)malloc(sizeof(CircleLinkList));
      6     if (list == NULL)
      7     {
      8         exit(1);
      9     }
     10     list->head.next = &(list->head);//头结点指向自己
     11     list->size = 0;
     12 
     13     return list;
     14 }
     15 //插入
     16 void Insert_CircleLinkList(CircleLinkList* list, int pos, CircleLinkNode* value)
     17 {
     18     if (list == NULL)
     19     {
     20         exit(1);
     21     }
     22 
     23     if (value == NULL)
     24     {
     25         exit(1);
     26     }
     27 
     28     if (pos < 0 || pos > list->size)
     29     {
     30         pos = list->size;
     31     }
     32 
     33     //辅助指针变量借助指针找到查找位置的前一个结点
     34     CircleLinkNode* pCurrent = &(list->head);
     35     for(int i = 0; i < list->size; i++)
     36     {
     37         pCurrent = pCurrent->next;
     38     }
     39 
     40     //插入
     41     value->next = pCurrent->next;
     42     pCurrent->next = value;
     43 
     44     list->size++;
     45 }
     46 //获取第一个元素
     47 CircleLinkNode* Front_CircleLinkList(CircleLinkList* list)
     48 {
     49     if (list == NULL)
     50     {
     51         exit(1);
     52     }
     53 
     54     return list->head.next;
     55 }
     56 //获取最后一个元素
     57 CircleLinkNode* Back_CircleLinkList(CircleLinkList* list)
     58 {
     59     if (list == NULL)
     60     {
     61         exit(1);
     62     }
     63 
     64     //辅助指针变量借助指针找到查找位置的前一个结点
     65     CircleLinkNode* pCurrent = &(list->head);
     66     for(int i = 0;i <list->size;++i)
     67     {
     68         pCurrent = pCurrent->next;
     69     }
     70 
     71     return pCurrent;
     72 }
     73 //根据位置删除
     74 void RemovePos_CircleLinkList(CircleLinkList* list, int pos)
     75 {
     76     if (list == NULL)
     77     {
     78         exit(1);
     79     }
     80 
     81     if (pos < 0 || pos >= list->size)
     82     {
     83         exit(1);
     84     }
     85 
     86     //辅助指针变量找位置前一个结点
     87     CircleLinkNode* pCurrent = &(list->head);
     88     for (int i = 0; i < pos; ++i)
     89     {
     90         pCurrent = pCurrent->next;
     91     }
     92 
     93     //删除
     94     CircleLinkNode* p = pCurrent->next;
     95     pCurrent->next = p->next;
     96     list->size--;
     97 }
     98 //根据值删除
     99 void RemoveValue_CircleLinkList(CircleLinkList* list, CircleLinkNode* value, COMPARENODE compare)
    100 {
    101     if (list == NULL)
    102     {
    103         exit(1);
    104     }
    105 
    106     if (value == NULL)
    107     {
    108         exit(1);
    109     }
    110 
    111     //辅助指针变量找位置前一个结点
    112     CIRCLELINKNODE* pCurrent = &(list->head);
    113     CIRCLELINKNODE* qCurrent = pCurrent->next;
    114     for(int i = 0;i < list->size; ++i)
    115     {
    116         if (compare(qCurrent, value) == 0)
    117         {
    118             pCurrent->next = qCurrent->next;
    119             list->size--;
    120             break;
    121         }
    122         pCurrent = qCurrent;
    123         qCurrent = pCurrent->next;
    124     }    
    125 }
    126 //获得链表长度
    127 int Length_CircleLinkList(CircleLinkList* list)
    128 {
    129     if (list == NULL)
    130     {
    131         exit(1);
    132     }
    133 
    134     return list->size;
    135 }
    136 
    137 //释放
    138 void Free_CircleLinkList(CircleLinkList* list)
    139 {
    140     if (list == NULL)
    141     {
    142         exit(1);
    143     }
    144 
    145     free(list);
    146 }
    147 //查找
    148 int Find_CircleLinkList(CircleLinkList* list, CircleLinkNode* value, COMPARENODE compare)
    149 {
    150     if (list == NULL)
    151     {
    152         exit(1);
    153     }
    154 
    155     if (value == NULL)
    156     {
    157         exit(1);
    158     }
    159 
    160     CIRCLELINKNODE* pCurrent = list->head.next;
    161     int flag = -1;
    162     for (int i = 0; i < list->size; ++i)
    163     {
    164         if (compare(pCurrent, value) == 0)
    165         {
    166             flag = i;
    167             break;
    168         }
    169         pCurrent = pCurrent->next;
    170     }
    171 
    172     return flag;
    173 }
    174 
    175 //判断是否为空
    176 bool IsEmpty_Find_CircleLinkList(CircleLinkList* list)
    177 {
    178     if (list == NULL)
    179     {
    180         exit(1);
    181     }
    182 
    183     return list->size == 0;
    184 }
    185 
    186 //打印
    187 void Print_CircleLinkList(CircleLinkList* list, PRINTNODE print)
    188 {
    189     if (list == NULL)
    190     {
    191         exit(1);
    192     }
    193 
    194     //辅助指针变量
    195     CircleLinkNode* pCurrent = list->head.next;
    196     for (int i = 0; i < list->size; i++)
    197     {
    198         if (pCurrent == &(list->head))
    199         {
    200             pCurrent = pCurrent->next;
    201             printf("---------------------
    ");
    202         }
    203         print(pCurrent);
    204         pCurrent = pCurrent->next;
    205     }
    206 
    207     
    208 }

    1、基本功能测试:

      1 #include"CircleLinkList.h"
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #include<stdio.h>
      5 //要添加到链表中的元素类型
      6 typedef struct PERSON
      7 {
      8     CircleLinkNode node;
      9     char name[65];
     10     int age;
     11     int score;
     12 }Person;
     13 
     14 void MyPrint(CircleLinkNode* value)
     15 {
     16     Person* p = (Person*)value;
     17     printf("Name : %s  Age : %d Score %d
    ", p->name, p->age, p->score);
     18 }
     19 
     20 int MyCompare(CircleLinkNode* value1, CircleLinkNode* value2)
     21 {
     22     Person* p1 = (Person*)value1;
     23     Person* p2 = (Person*)value2;
     24 
     25     if (strcmp(p1->name, p2->name) == 0 && p1->age == p2->age && p1->score == p2->score)
     26     {
     27         return 0;
     28     }
     29 
     30     return -1;
     31 }
     32 
     33 int main(int argc, const char* argv[])
     34 {
     35     //创建循环链表
     36     CircleLinkList* list = Init_CircleLinkList();
     37     //创建数据
     38     Person p1, p2, p3, p4, p5;
     39     strcpy_s(p1.name, "aaa");
     40     strcpy_s(p2.name, "bbb");
     41     strcpy_s(p3.name, "ccc");
     42     strcpy_s(p4.name, "ddd");
     43     strcpy_s(p5.name, "eee");
     44 
     45     p1.age = 20;
     46     p2.age = 30;
     47     p3.age = 40;
     48     p4.age = 50;
     49     p5.age = 60;
     50 
     51     p1.score = 55;
     52     p2.score = 66;
     53     p3.score = 77;
     54     p4.score = 88;
     55     p5.score = 99;
     56 
     57     //插入
     58     Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p1);
     59     Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p2);
     60     Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p3);
     61     Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p4);
     62     Insert_CircleLinkList(list, 0, (CircleLinkNode*)&p5);
     63     //打印数据
     64     Print_CircleLinkList(list, MyPrint);
     65     printf("------------------
    ");
     66     //返回第一个元素
     67     CircleLinkNode* value = Front_CircleLinkList(list);
     68     Person* p = (Person*)value;
     69     printf("第一个元素Name : %s  Age : %d Score %d
    ", p->name, p->age, p->score);
     70     printf("------------------
    ");
     71     //返回最后一个元素
     72     CircleLinkNode* value1 = Back_CircleLinkList(list);
     73     Person* g = (Person*)value1;
     74     printf("最后一个元素Name : %s  Age : %d Score %d
    ", g->name, g->age, g->score);
     75     printf("------------------
    ");
     76     //返回数据元素个数
     77     int length = Length_CircleLinkList(list);
     78     printf("数据元素个数:%d-----------------
    ", length);
     79     //链表是否为空
     80     bool ret = IsEmpty_Find_CircleLinkList(list);
     81     printf("链表是否为空:%d-----------------
    ", ret);
     82     //链表按值删除
     83     Person p7;
     84     strcpy_s(p7.name, "ccc");
     85     p7.age = 40;
     86     p7.score = 77;
     87     //RemoveValue_CircleLinkList(list, (CircleLinkNode*)&p7, MyCompare);
     88     //Print_CircleLinkList(list, MyPrint);
     89     printf("------------------
    ");
     90     //链表按位置删除
     91     RemovePos_CircleLinkList(list, 2);
     92     Print_CircleLinkList(list, MyPrint);
     93     printf("------------------
    ");
     94     //查找某值
     95     Person p8;
     96     strcpy_s(p8.name, "aaa");
     97     p8.age = 20;
     98     p8.score = 55;
     99     int i = Find_CircleLinkList(list, (CircleLinkNode*)&p8, MyCompare);
    100     printf("%d", i);
    101     Free_CircleLinkList(list);
    102     system("pause");
    103     return 0;
    104 }

    结果:

    2、循环链表测试约瑟夫问题:

    //#include"企业链表.h"
    #include"CircleLinkList.h"
    #include<string.h>
    #include<stdlib.h>
    #include<stdio.h>
    
    #define M 8
    #define N 3
    //数据元素结构体
    typedef struct PERSON
    {
        CircleLinkNode node;
        int data;
    }Person;
    
    void MyPrint(CircleLinkNode* value)
    {
        Person* p = (Person*)value;
        printf("data : %d  
    ", p->data);
    }
    
    int MyCompare(CircleLinkNode* value1, CircleLinkNode* value2)
    {
        Person* p1 = (Person*)value1;
        Person* p2 = (Person*)value2;
    
        if ( p1->data == p2->data)
        {
            return 0;
        }
    
        return -1;
    }
    
    int main(int argc, const char* argv[])
    {
        //创建循环链表
        CircleLinkList* list = Init_CircleLinkList();
        //创建数据
        Person num[M];
        for (int i = 0; i < M; ++i)
        {
            num[i].data = i + 1;
            Insert_CircleLinkList(list, i, (CircleLinkNode*)&num[i]);
        }
        
        //打印数据
        Print_CircleLinkList(list, MyPrint);
        printf("------------------
    ");
        
        //辅助指针变量
        CircleLinkNode* pCurrent = list->head.next;
        int index = 1;
        while (Length_CircleLinkList(list) > 1)
        {
            if (index == N)
            {
                Person* temp = (Person*)pCurrent;
                printf("value:%d
    ", temp->data);
    
                CircleLinkNode* p = pCurrent->next;
                RemoveValue_CircleLinkList(list, pCurrent, MyCompare);
                pCurrent = p;
    
                if (pCurrent == &(list->head))
                {
                    pCurrent = pCurrent->next;
                }
    
                index = 1;
            }
    
    
            pCurrent = pCurrent->next;
            if (pCurrent == &(list->head))
            {
                pCurrent = pCurrent->next;
            }
            index++;
        }
    
        if (Length_CircleLinkList(list) == 1)
        {
            Person* tmp = (Person*)Front_CircleLinkList(list);
            printf("value:%d", tmp->data);
        }
    
        Free_CircleLinkList(list);
        system("pause");
        return 0;
    }

  • 相关阅读:
    websocket初体验(能传文字和图片)
    展开折叠效果 height未知 transition无效
    微信小程序自定义键盘
    微信小程序 selectComponent 值为null
    css 斜线 animation
    【转】怎样在ubuntu12.04下创建一个启动器
    以ontouch为例说明android事件发送机制
    谈谈移动应用设计——从一个普通开发者的角度
    Launch error: Failed to connect to remote VM. Connection refused.的解决办法
    Beyond compare代码比较工具。
  • 原文地址:https://www.cnblogs.com/dhhu007/p/13490723.html
Copyright © 2020-2023  润新知