单链表的原理及实现

版权声明:本文为博主原创文章,转载或其它用途请注明出处 https://blog.csdn.net/llwsg_srsnh/article/details/84727817                                                                                   单链表的原理及实现

在数据结构中,链表是通过线性结构链式存储实现的。下面介绍最简单的链表,单链表.

         单链表,包含头指针、头节点、以及头节点指向的链表内容。

         节点由两部分组成,数据域和地址域。数据域用于存储该节点的数据。地址域存储下一节点的位置信息(通常是指针,即下一节点的地址信息)。最后一个节点的地址域为空。

        节点又分为两种,头节点,和数据节点。头节点数据域,用于存放链表的信息(长度等,非整型时可转换类型)。链表的第一个有效节点(数据节点),是头节点地址域,指向的节点a1。

 

        下面是用C语言实现单链表的创建、插入、查询、删除功能。

头文件:

/************************************************************
Copyright(C), 2018, YUTIAN Tech. Co.,Ltd..

FileName:Linklist.h

Author: leileibwlxd@163.com   Version: 1.0        Date: 2018/12/02

Description: 单链表头文件,函数声明

Version: 1.0

FunctionList:   CreatLinkList、InsertElem、DeleteIndexElem、GetElem

1. -------

History:        Init

<author>  <time>  <version >  <desc>

David   2018/12/02    1.0     build this file
***********************************************************/

#ifndef _LINK_LIST_H_
#define _LINK_LIST_H_

typedef int ElemType;

typedef struct  Node
{
	ElemType data;
	struct Node *next;
}Node, *LinkList;


static const ElemType initArray[] = { 9,8,7,6,5,4,3,2,10,11,13,14,15};

int CreatLinkList(LinkList &l, int n);
int InsertElem(LinkList &l, int n, ElemType e);
int DeleteIndexElem(LinkList &l, int n);
int GetElem(const LinkList &l, int n, ElemType &e);

#endif

源文件

/************************************************************
Copyright(C), 2018, YUTIAN Tech. Co.,Ltd..

FileName:Linklist.cpp

Author: leileibwlxd@163.com   Version: 1.0        Date: 2018/12/02

Description: 单链表源文件

Version: 1.0

FunctionList:   CreatLinkList、InsertElem、DeleteIndexElem、GetElem

1. -------

History:        Init

<author>  <time>  <version >  <desc>

David   2018/12/02    1.0     build this file
***********************************************************/

#include <stdlib.h>
#include "LinkList.h"

/*************************************************
Function: CreatLinkList
Description: 创建一个链表,并用头插法插入元素
Author: leileibwlxd@163.com
Input: l, n
Output: l
Return: -2:堆内存申请失败, 0:执行成功
Others:
*************************************************/
int CreatLinkList(LinkList &l, int n)
{
	l = (LinkList)malloc(sizeof(Node));
	l->data = 0;
	l->next = NULL;

	int index = 0;
	for (index = n; index > 0; --index)//头插法插入
	{
		LinkList p = (LinkList)malloc(sizeof(Node));

		if (!p)
		{
			return -2;
		}

		if (n >= sizeof(initArray) / sizeof(initArray[0]))
		{
			p->data = initArray[sizeof(initArray) / sizeof(initArray[0])];
		}
		else
		{
			p->data = initArray[index];
		}

		p->next = l->next;
		l->next = p;
	}
	return 0;
}

/*************************************************
Function: InsertElem
Description: 在l链表,位置n处,插入一个元素e
Author: leileibwlxd@163.com
Input: l, n, e
Output: l
Return: -1:n大于链表长度, -2:堆内存申请失败, 0:执行成功
Others:
*************************************************/
int InsertElem(LinkList &l, int n, ElemType e)
{
	int index = 0;
	
	Node* p = l;

	for (; index < n; ++index)
	{
		p = p->next;

		if (!p)
		{
			return -1;//找不到第n个元素
		}
	}

	Node *q = (Node*)malloc(sizeof(Node));
	if (!q)
	{
		return -2;
	}

	q->next = p->next;
	q->data = e;
	p->next = q;

	return 0;
}

/*************************************************
Function: DeleteIndexElem
Description: 在l链表,位置n处,删除元素
Author: leileibwlxd@163.com
Input: l, n
Output: l
Return: -1:n大于链表长度, 0:执行成功
Others: 
*************************************************/
int DeleteIndexElem(LinkList &l, int n)
{
	if (0 == n)
	{
		return -1;
	}

	int index = 0;

	Node* p = l;
	for (; index < n-1; ++index)//找到要删除的前一个元素位置
	{
		p = p->next;
		if (!p)
		{
			return -1;//找不到第n-1个元素
		}
	}

	Node* q = p -> next;
	p->next = q->next;
	free (q);
	q = NULL;

	return 0;
}

/*************************************************
Function: GetElem
Description: 在l链表,位置n处,获取元素
Author: leileibwlxd@163.com
Input: l, n, e
Output: e
Return: -1:n大于链表长度, 0:执行成功
Others:
*************************************************/
int GetElem(const LinkList &l, int n, ElemType &e)
{
	int index = 0;

	Node *p = l;
	for (; index < n; ++index)
	{
		p = p->next;
		if (!p)
		{
			return -1;//未找到位置n的元素
		}
	}

	e = p->data;
	return 0;
}

测试代码:

/************************************************************
Copyright(C), 2018, YUTIAN Tech. Co.,Ltd..

FileName:main.cpp

Author: leileibwlxd@163.com   Version: 1.0        Date: 2018/12/02

Description: 测试文件

Version: 1.0

FunctionList:   TraversalLinklist

1. -------

History:        Init

<author>  <time>  <version >  <desc>

David   2018/12/02    1.0     build this file
***********************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"

bool TraversalLinklist(const LinkList &L);

int main()
{
	LinkList l;
	int n;

	printf("Input LinkList node number:");
	scanf_s("%d", &n);
	CreatLinkList(l, n);
	TraversalLinklist(l);

	printf("\nDelete LinkList node number:");
	scanf_s("%d", &n);
	DeleteIndexElem(l, n);
	TraversalLinklist(l);

	InsertElem(l, 0, 0);
	TraversalLinklist(l);

	InsertElem(l, 4, 4);
	TraversalLinklist(l);

	InsertElem(l, 5, 10);
	TraversalLinklist(l);

	return 0;
}

bool TraversalLinklist(const LinkList &L)
{
	int index = 0;

	Node * p = L;
	printf("\n");

	//以最后一个元素指针域为空遍历
	while (p->next)
	{
		p = p->next;
		printf("%d  ", p->data);
	}

	return true;
}


 

 

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值