版权声明:本文为博主原创文章,转载或其它用途请注明出处 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;
}