• 13、单向链表


    头文件:LinkList.h

     1 #ifndef LINKLIST_H
     2 #define LINKLIST_H
     3 
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 #include<string.h>  
     7 //链表结点
     8 typedef struct LINKNODE{
     9     void* data;//无类型指针,可以指向任何类型数据
    10     struct LINKNODE* next;
    11 }LinkNode;
    12 //链表结构体
    13 typedef struct LINKLIST {
    14     LinkNode* head;
    15     int size;
    16     //需要容量吗?不需要,链表是根据所需去申请内存
    17 }LinkList;
    18 
    19 //打印函数指针
    20 typedef void(*PRINTLINKNODE)(void*);
    21 
    22 
    23 //初始化链表
    24 LinkList* Init_LinkList();
    25 //指定位置插入
    26 void Insert_LinkList(LinkList* list,int pos,void* data);
    27 //删除指定位置的值
    28 void RemoveByPos_LinkList(LinkList* list, int pos);
    29 //返回链表的长度
    30 int Size_LinkList(LinkList* list);
    31 //查找
    32 int Find_LinkList(LinkList* list,void* data);
    33 //返回第一个结点
    34 void*Front_LinkList(LinkList* list);
    35 //打印链表结点
    36 void Print_LinkList(LinkList* list, PRINTLINKNODE print);
    37 //释放链表内存
    38 void FreeSpace_LinkList(LinkList* list);
    39 
    40 #endif

    LinkList.c

      1 #include"LinkList.h"
      2 
      3 
      4 //初始化链表
      5 LinkList* Init_LinkList() {
      6 
      7     LinkList* list = (LinkList*)malloc(sizeof(LinkList));
      8     list->size = 0;
      9     //头结点 不保存数据信息
     10     list->head = (LinkNode*)malloc(sizeof(LinkNode));
     11     list->head->data = NULL;
     12     list->head->next = NULL;
     13 
     14     return list;
     15 
     16 }
     17 //指定位置插入
     18 void Insert_LinkList(LinkList* list, int pos, void* data) {
     19     if (list == NULL) {
     20         return;
     21     }
     22     if (data == NULL) {
     23         return;
     24     }
     25     //判断,pos越界
     26     if (pos<0||pos>list->size) {
     27         pos = list->size;
     28     }
     29     //创建新的结点
     30     LinkNode* newnode = (LinkNode*)malloc(sizeof(LinkNode));
     31     newnode->data = data;
     32     newnode->next = NULL;
     33 
     34     //找结点
     35     //辅助指针变量
     36     LinkNode* pCurrent = list->head;
     37     for (int i = 0; i < pos; i++) {
     38         pCurrent = pCurrent->next;
     39     }
     40 
     41     //新结点入链表
     42     newnode->next = pCurrent->next;
     43     pCurrent->next = newnode;
     44 
     45     list->size++;
     46 }
     47 //删除指定位置的值
     48 void RemoveByPos_LinkList(LinkList* list, int pos) {
     49 
     50     if (list==NULL) {
     51         return;
     52     }
     53     if(pos<0 || pos>=list->size)
     54     {
     55         return;
     56     }
     57     //查找删除结点的前一个结点
     58     LinkNode* pCurrent = list->head;
     59     for (int i = 0; i < pos; i++) {
     60         pCurrent = pCurrent->next;
     61     }
     62 
     63     //缓存删除的结点
     64     LinkNode* pDel = pCurrent->next;
     65     pCurrent->next = pDel->next;
     66     //释放删除结点的内存
     67     free(pDel);
     68 
     69     list->size--;
     70 
     71 }
     72 //返回链表的长度
     73 int Size_LinkList(LinkList* list) {
     74 
     75     return list->size;
     76 }
     77 //查找
     78 int Find_LinkList(LinkList* list, void* data) {
     79     if (list == NULL) {
     80         return -1;
     81     }
     82     if (data == NULL) {
     83         return -1;
     84     }
     85     //遍历查找
     86     LinkNode* pCurrent = list->head->next;//指向第一个有效数字
     87     int i = 0;
     88     while (pCurrent !=NULL)
     89     {
     90         if (pCurrent->data == data) {
     91             break;
     92         }
     93         i++;
     94         pCurrent = pCurrent->next;
     95     }
     96     
     97     return i;
     98 }
     99 //返回第一个结点
    100 void* Front_LinkList(LinkList* list) {
    101 
    102     return list->head->next->data;
    103 }
    104 //打印链表结点
    105 void Print_LinkList(LinkList* list, PRINTLINKNODE print) {
    106     if (list==NULL) {
    107         return;
    108     }
    109     //辅助指针变量
    110     LinkNode* pCurrent = list->head->next;
    111     while (pCurrent != NULL) {
    112         print(pCurrent->data);
    113         pCurrent = pCurrent->next;
    114     }
    115 
    116 }
    117 //释放链表内存
    118 void FreeSpace_LinkList(LinkList* list) {
    119     if (list == NULL) {
    120         return;
    121     }
    122     //辅助指针变量
    123     LinkNode* pCurrent = list->head;
    124     while (pCurrent != NULL) {
    125         //缓存下一个结点
    126         LinkNode* pNext = pCurrent->next;
    127         free(pCurrent);
    128         pCurrent = pNext;
    129     }
    130     //释放链表内存
    131     list->size = 0;
    132     free(list);
    133 }

    main.c

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<string.h>  
     5 #include"LinkList.h"
     6 
     7 //自定义数据类型
     8 typedef struct PERSON {
     9     char name[64];
    10     int age;
    11     int score;
    12 }Person;
    13 //打印函数
    14 void MyPrint(void* data) {
    15     Person* p = (Person*)data;
    16     printf("Name:%s Age:%d Score:%d
    ",p->name,p->age,p->score);
    17 }
    18 
    19 int main()
    20 {
    21     //创建一个链表
    22     LinkList* list = Init_LinkList();
    23 
    24     //创建数据
    25     Person p1 ={ "aaa",18,100 };
    26     Person p2 = { "bbb",19,99 };
    27     Person p3 = { "ccc",20,98 };
    28     Person p4 = { "ddd",21,70 };
    29     Person p5 = { "eee",22,59 };
    30     //数据插入链表
    31     Insert_LinkList(list, 0, &p1);
    32     Insert_LinkList(list, 0, &p2);
    33     Insert_LinkList(list, 0, &p3);
    34     Insert_LinkList(list, 0, &p4);
    35     Insert_LinkList(list, 0, &p5);
    36 
    37     //打印链表
    38     Print_LinkList(list, MyPrint);
    39 
    40     //删除3
    41     RemoveByPos_LinkList(list, 3);
    42 
    43     //打印
    44     printf("--------------------------
    ");
    45     Print_LinkList(list, MyPrint);
    46 
    47     //返回第一个结点
    48     printf("-----查找结果---------
    ");
    49     Person* ret = (Person*)Front_LinkList(list);
    50     printf("Name:%s Age:%d Score:%d
    ", ret->name, ret->age, ret->score);
    51 
    52 
    53 
    54 
    55     //销毁链表
    56     FreeSpace_LinkList(list);
    57 
    58 
    59     system("pause");
    60     return 0;
    61 }

    VS2015运行结果

  • 相关阅读:
    网络协议研究的工具-NS3
    指数ETF基金的组合分析方法初探
    小结量化投资之路(2013年写的旧帖再加工)
    金融计算的开源库——QuantLib 学习入门
    如何系统学习网络技术
    学好编程的几个方面
    C++的学习思路(总结以备忘)
    Think in SAS
    springSecurity + OAuth2 获取Token流程分析以及增加协议授权模式
    Redis主从复制、哨兵、Cluster三种模式
  • 原文地址:https://www.cnblogs.com/luanxin/p/8933015.html
Copyright © 2020-2023  润新知