数据结构之_单链表的实现

数据结构之_单链表的实现

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

数据结构之_单链表的实现的相关文章

PHP数据结构之实现单链表

学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $next; public function __construct($id,$name) //构造函数 { $this->id=$id; $this->name=$name; $this->next=null; } } class linklist //链表的数据结构 { private $he

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

数据结构 链表_单链表的接口定义

链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操作时链表拥有更高的效率.链表需要动态的开辟存储空间,也就是存储空间是在程序运行时分配的.由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点. 单链表介绍 单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成.每个元素包含两个部分:数据成员和一个称为

【数据结构】顺序存储单链表

数据结构之单链表的顺序存储实现 闲来无事,回顾下以前学过的数据结构,写个玩玩,理论的东西就不多说了,网上一搜一大堆: 重要的是需要掌握这种数据结构的思想,整个数据结构这门课最重要的也是思想! 下面是代码: //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename:

厦门大学数据结构期末考试单链表问题

因为过几天要去参加厦门大学的夏令营,提前刷了下厦门大学往年的期末考试试卷. 卷中有这么一道题目: 有一个单链表,其结点的元素值以递增顺序排列,给出数据结构,并编写一个算法删除该单链表中元素值相同的结点. 算法如下: 从头到尾扫描单链表,若当前结点和后继结点的值不相同,则指针后移,若相同,则删除该后继结点. 1 #include "stdio.h" 2 3 typedef struct Node{ 4 int data; 5 struct Node *next; 6 }Node, *Li

数据结构基础(8) --单链表的设计与实现(1)之基本操作

链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N); 链表的特点: 由于在链表中插入/删除元素都不需要进行数据的移位, 只需要O(1)时间完成, 因此链表适用于频繁插入与删除的情况; 但是链表也有缺点

【C语言数据结构】循环单链表

CircleLinkList.h #ifndef CIRCLE_LINK_LIST #define CIRCLE_LINK_LIST //链表节点 typedef struct _CircleLinkListNode {     struct _CircleLinkListNode *next; }CircleLinkListNode; //循环单链表 typedef void CircleLinkList; /*  * 创建循环单链表  * @return 返回循环单链表的指针  */ Cir

【C语言数据结构】静态单链表

StaticLinkLinst.h #ifndef STATIC_LINKLIST_H #define STATIC_LINKLIST_H typedef void StaticLinkListNode;    //静态单链表节点 typedef void StaticLinkList;        //静态单链表 /*  * 创建静态单链表  * @param capacity 静态单链表的最大容量  * @return 返回静态单链表的指针  */ StaticLinkList* Stat

C++ 数据结构学习二(单链表)

模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespace std; template<class T>struct Node{ T data; Node * next;}; template<class T>class LinkList{ public: LinkList(); //无参构造函数,建立只有头结点的空链表 LinkList