代码先锋网 代码片段及技术文章聚合

实现单链表各种基本运算的算法

线性表的链式存储结构称为链表。其中每个存储结点不仅包含元素本身的信息(称为数据域),而且包含表示元素之间的逻辑关系信息,在C/C++语言中采用指针来实现,这称为指针域。

 

#include<stdio.h>
#include<malloc.h>
typedef char ElemType;

typedef struct LNode
{
	ElemType data;      //存放元素值
	struct LNode *next;  //指向后继结点
}LinkNode;				  //声明单链表节点类型
void CreateListF(LinkNode *&L, ElemType a[], int n)//头插法建立单链表
{
	LinkNode *s;
	L = (LinkNode *)malloc(sizeof(LinkNode));//创建头结点
	L->next = NULL;         //创建头结点,其next域值为NULL
	for (int i = 0; i < n; i++)  //循环建立数据结点s
	{
		s = (LinkNode *)malloc(sizeof(LinkNode));//创建新结点
		s->data = a[i];	//创建数据结点s
		s->next = L->next;  //将结点s插在原开始结点之前,头结点之后
		L->next = s;
	}
}
void CreateListR(LinkNode *&L, ElemType a[], int n)//尾插法建立单链表
{
	LinkNode *s, *r;
	L = (LinkNode *)malloc(sizeof(LinkNode));//创建头结点
	L->next = NULL;
	r = L;			//r始终指向尾结点,开始是指向头结点
	for (int i = 0; i < n; i++)  //循环建立数据结点s
	{
		s = (LinkNode *)malloc(sizeof(LinkNode));//创建新结点s
		s->data = a[i];     //创建数据结点s
		r->next = s;        //将结点s插入r结点之后
		r = s;
	}
	r->next = NULL;       //尾结点的next域值为NULL
}
void InitList(LinkNode *&L) //初始化线性表
{
	L = (LinkNode*)malloc(sizeof(LinkNode)); //创建头结点
	L->next = NULL;       //创建头结点,其next域值为NULL
}
void DestroyList(LinkNode *&L)//销毁线性表
{
	LinkNode *pre = L, *p = pre->next;//pre指向结点p的前驱结点
	while (p != NULL)    //扫描单链表L
	{
		free(pre);     //释放pre结点
		pre = p;         //pre、p同步后移一个结点
		p = pre->next;
	}
	free(pre);      //循环结束时p为NULL,pre指向尾结点,释放它
}
bool ListEmpty(LinkNode *L)   //判断线性表是否为空
{
	return(L->next == NULL);
}
int ListLength(LinkNode *L)  //求线性表的长度
{
	int i = 0;
	LinkNode *p = L;    //p指向头结点,n置为0(即头结点的序号为0)
	while (p->next != NULL)
	{
		i++;
		p = p->next;
	}
	return i;     //循环结束时,p指向尾结点,其序号n为结点个数
}
void DispList(LinkNode *L)   //输出线性表 
{
	LinkNode *p = L->next;   //p指向首结点
	while (p != NULL)   //p不为NULL,输出p结点的data域
	{
		printf("%c", p->data);
		p = p->next;      //p移向下一个结点
	}
	printf("\n");
}
bool GetElem(LinkNode *L, int i, ElemType &e)//求线性表中的某个数据元素值
{
	int j = 0;                     
	LinkNode *p = L;      //p指向头结点,j置为0(即头结点的序号)
	if (i <= 0) return false;   //i错误返回假
	while (j < i&&p != NULL)    //找第i个结点
	{
		j++;
		p = p->next;
	}
	if (p == NULL)   //不存在第i个结点
		return false;
	else           //存在第i个结点
	{
		e = p->data;  //当j=i时,将这个元素的值赋给e
		return true;
	}
}
int LocateElem(LinkNode *L, ElemType e)//按元素查找
{
	int i = 1;
	LinkNode *p = L->next;    //p指向首结点,i置1(即首结点的序号为1)
	while (p != NULL && p->data != e)  //查找data值为1的结点,其序号为i
	{
		p = p->next;
		i++;
	}
	if (p == NULL)   //不存在值为e的结点,返回0
		return 0;
	else             //存在值为e的结点,返回逻辑序号i
		return i;
}
bool ListInsert(LinkNode *&L, int i, ElemType e)//插入第i个数据元素
{
	int j = 0;
	LinkNode *p = L, *s;    //指向头结点,j置0(即头结点的序号为0)
	if (i <= 0)
		return false;
	while (j < i - 1 && p != NULL)  //查找第i-1个结点
	{
		j++;
		p = p->next;
	}
	if (p == NULL)    //未找到第i-1个结点,返回false
		return false;
	else             //找到第i-1个结点p,插入新结点并返回true
	{
		s = (LinkNode*)malloc(sizeof(LinkNode));
		s->data = e;          //创建新结点s,其域值为e
		s->next = p->next;    //将s结点插入到结点p之后
		p->next = s;
		return true;
	}
}

bool ListDelete(LinkNode *&L, int i, ElemType &e)//删除第i个元素
{
	int j = 0;
	LinkNode *p = L, *q;    //p指向头结点,j置为0(即头结点的序号为0)
	if (i <= 0)
		return false;        //i错误返回假
	while (j < i - 1 && p != NULL)    //查找第i-1个结点
	{
		j++;
		p = p->next;
	}
	if (p == NULL)       //未找到第i-1个结点,返回false
		return false;
	else                  //找到第i - 1个结点p
	{
		q = p->next;       //q指向第i个结点
		if (q == NULL)      //若不存在第i个结点,返回false
			return false;
		e = q->data;
		p->next = q->next;   //从单链表中删除q结点
		free(q);             //释放q结点
		return true;        //返回true表示成功删除第i个结点
	}
}
int main()
{
	LinkNode *h;
	ElemType e;
	printf("单链表的基本运算如下:\n");
	printf(" (1) 初始化单链表h\n");
	InitList(h);
	printf(" (2)依次采用尾插法插入a,b,c,d,e元素\n");
	ListInsert(h, 1, 'a');
	ListInsert(h, 2, 'b');
	ListInsert(h, 3, 'c');
	ListInsert(h, 4, 'd');
	ListInsert(h, 5, 'e');
	printf(" (3)输出单链表h:\n");
	DispList(h);
	printf(" (4)单链表h长度:%d\n", ListLength(h));
	printf(" (5)单链表h为%s\n", (ListEmpty(h) ? "空":"非空"));
	GetElem(h, 3, e);
	printf(" (6)单链表h的第3个元素:%c\n", e);
	printf(" (7)元素a的位置:%d\n", LocateElem(h, 'a'));
	printf(" (8)在第4个元素位置上插入f元素\n");
	ListInsert(h, 4, 'f');
	printf(" (9)输出单链表h:\n");
	DispList(h);
	printf(" (10)删除h的第3个元素\n");
	ListDelete(h, 3, e);
	printf(" (11)输出单链表h:\n");
	DispList(h);
	printf(" (12)释放单链表h\n");
	DestroyList(h);
	return 1;

}

 

版权声明:本文为qq_43554997原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43554997/article/details/88555076

智能推荐

单链表基本运算(运用递归算法)

#include<iostream.h> typedef int ElemType; typedef struct LNode { ElemType data; //存放结点数据 struct LNode *next; //指向下一个同类型节点指针 }linklist; //单链表节点类型 //1.建立链表 void jianli(linklist *&L,int W) //创...

15-单链表的基本运算实现

1. 单链表的数据抽象类型   对于单链表来说,它是线性表的一种存储结构,当我们把单链表的数据对象,数据关系,数据操作描述出来后,然后就可以考虑基本操作的实现了。 ADT ——线性表: 2. 单链表的基本运算实现 1.初始化线性表InitList(L)   InitList()运算用于建立一个空的单链表,即创建一个头节点,这个头结点一...

链表——单链表的基本运算

实现单链表的基本运算:初始化、插入、删除、求表的长度、判空、释放。 (1)初始化单链表L,输出L->next的值; (2)依次采用尾插法插入元素:输入分两行数据,第一行是尾插法需要插入的字符数据的个数,第二行是具体插入的字符数据。 (3)输出单链表L; (4)输出单链表L的长度; (5)判断单链表L是否为空; (6)输出单链表L的第3个元素; (7)输出元素a的位置; (8)在第4个元素位置...

顺序栈各种基本运算的算法

【代码】//文件名:sqstack.cpp...

猜你喜欢

顺序串各种基本运算的算法

sqstring.cpp中源程序代码: 测试程序代码:...

编写实现单链表的各种基本运算,并在此基础上设计一个主函数完成如下功能:

##单链表基本运算的笔记(可供一些初学者学习) (1)初始化单链表L。 (2)依次采用尾插法插入h、e、l、l、o。 (3)输出单链表L。 (4)输出单链表L的长度。 (5)判断单链表L是否为空。 (6)输出单链表L的第2个和第4个元素。 (7)输出元素o位置。 (8)在单链表L的第4个位置上插入元素r。 (9)输出单链表L。 (10)删除单链表L的第3个元素。 (11)输出单链表L。 (12)释...

数据结构第五版第二章实验2.实现单链表的各种基本运算

编写一个程序exp2-2.cpp,实现单链表的各种基本运算(假设单链表的元素类型为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...

遍历 names.txt 文件,输出长度最长的回文人名

判断是否是回文有三种方法: 一、 先使指针指向字符串中第一个元素和最后一个元素,进行比较:   如果不相同,则不是回文,返回 False;   如果相同,两边指针各往中间移动一个单位,继续比较。   若两指针相遇,证明字符串对称的位置元素相同,也就是回文,返回True 代码如下: 二、回文字符串的递归判断:   假设只...