数据结构之_单链表的实现
1.基本概念
- 链式存储定义
为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。
- 单链表
- 线性表的链式存储结构中,每个节点中只包含一个指针域,这样的链表叫单链表。
- 通过每个节点的指针域将线性表的数据元素按其逻辑次序链接在一起(如图)。
- 概念解释:
- 表头结点
链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息
-
- 数据结点
链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息
-
- 尾结点
链表中的最后一个数据结点,其下一元素指针为空,表示无后继。
2.设计与实现
- 插入操作
node->next = current->next; current->next = node;
- 删除操作
current->next = ret->next
3.优点和缺点
- 优点:
1.无需一次性定制链表的容量 2.插入和删除操作无需移动数据元素 |
- 缺点:
1.数据元素必须保存后继元素的位置信息 2.获取指定数据的元素操作需要顺序访问之前的元素 |
4.单链表的代码实现
LinkList.h
#ifndef LINKLIST_H #define LINKLIST_H #include<stdlib.h> #include<stdio.h> //链表小结点 typedef struct LINKNODE { struct LINKNODE* next; }LinkNode; //链表结点 typedef struct LINKLIST { LinkNode head; int size; }LinkList; //遍历函数指针 typedef void(*PRINTNODE)(LinkNode*); //比较函数指针 typedef int(*COMPARENODE)(LinkNode*, LinkNode*); //初始化链表 LinkList* Init_LinkList(); //插入 void Insert_LinkList(LinkList* list, int pos, LinkNode* data); //删除 void Remove_LinkList(LinkList* list, int pos); //查找 int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare); //返回链表大小 int Size_LinkList(LinkList* list); //打印 void Print_LinkList(LinkList* list, PRINTNODE print); //释放链表内存 void FreeSpace_LinkList(LinkList* list); #endif
LinkList.c
#include"LinkList.h" //初始化链表 LinkList* Init_LinkList() { LinkList* list = (LinkList*)malloc(sizeof(LinkList)); list->head.next = NULL; list->size = 0; return list; } //插入 void Insert_LinkList(LinkList* list, int pos, LinkNode* data) { if (list == NULL) { return; } if (data == NULL) { return; } if (pos < 0 || pos > list->size) { pos = list->size; } //查找插入位置 LinkNode* pCurrent = &(list->head); for (int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } //插入新节点 data->next = pCurrent->next; pCurrent->next = data; list->size++; } //删除 void Remove_LinkList(LinkList* list, int pos) { if (list == NULL) { return; } if (pos < 0 || pos >= list->size) { return; } //辅助指针变量 LinkNode* pCurrent = &(list->head); for (int i = 0; i < pos; i++) { pCurrent = pCurrent->next; } //删除结点 pCurrent->next = pCurrent->next->next; list->size--; } //查找 int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare) { if (list == NULL) { return -1; } if (data == NULL) { return -1; } //赋值指针变量 LinkNode* pCurrent = list->head.next; int index = 0; int flag = -1; while (pCurrent != NULL) { if (compare(pCurrent, data) == 0) { flag = index; break; } pCurrent = pCurrent->next; index++; } return flag; } //返回链表大小 int Size_LinkList(LinkList* list) { return 0; } //打印 void Print_LinkList(LinkList* list, PRINTNODE print) { if (list == NULL) { return; } //辅助指针 LinkNode* pCurrent = list->head.next; while (pCurrent != NULL) { print(pCurrent); pCurrent = pCurrent->next; } } //释放链表内存 void FreeSpace_LinkList(LinkList* list) { if (list == NULL) { return; } free(list); }
单向链表.c
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include "LinkList.h" //自定义数据类型 typedef struct PERSON { char name[64]; int age; int score; }Person; //打印函数 void MyPrint(void* data) { Person* p = (Person*)data; printf("Name:%s Age:%d Score:%d\n", p->name, p->age, p->score); } int main(void) { //创建链表 LinkList* list = Init_LinkList(); //创建数据 Person p1 = { "aaa", 18, 100 }; Person p2 = { "bbb", 19, 99 }; Person p3 = { "ccc", 20, 101 }; Person p4 = { "ddd", 17, 97 }; Person p5 = { "eee", 16, 59 }; //数据插入链表 Insert_LinkList(list, 0, &p1); Insert_LinkList(list, 0, &p2); Insert_LinkList(list, 0, &p3); Insert_LinkList(list, 0, &p4); Insert_LinkList(list, 0, &p5); //打印 Print_LinkList(list, MyPrint); //删除3 RemoveByPos_LinkList(list, 3); //打印 printf("---------------\n"); Print_LinkList(list, MyPrint); //返回第一个结点 printf("-----查找结果------------\n"); Person* ret = (Person*)Front_LinkList(list); printf("Name:%s Age:%d Score:%d\n", ret->name, ret->age, ret->score); //销毁链表 FreeSpace_LinkList(list); system("pause"); return 0; }
原文地址:https://www.cnblogs.com/wanghui1234/p/11196467.html
时间: 2024-11-05 22:35:45