13单向链表

Posted 乱丶心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\\n",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("--------------------------\\n");
45     Print_LinkList(list, MyPrint);
46 
47     //返回第一个结点
48     printf("-----查找结果---------\\n");
49     Person* ret = (Person*)Front_LinkList(list);
50     printf("Name:%s Age:%d Score:%d\\n", 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运行结果

 

以上是关于13单向链表的主要内容,如果未能解决你的问题,请参考以下文章

java模拟实现单向链表

单向链表的Java实现

单向链表的元素查找和删除

单向链表的python实现

[数据结构与算法] : 单向链表

单向链表JAVA代码