数据结构与算法之线性表

理论部分

1.线性表的定义与操作

1. 1 线性表的定义

线性表(LinearList)是由n个相同数据类型的数据元素a1,a2,a3…an组成的有序序列。表中数据元素个数成为表的长度。除首尾元素之外,其他元素有且仅有一个直接前驱和直接后继来表示位置关系。

1.2 线性表的基本操作

  1. 随机存取
  2. 插入操作
  3. 移除操作
  4. 查找操作
  5. 得到操作
  6. 是否为空
  7. 清空操作

2.线性表的存储与实现

2.1 顺序存储(顺序表)

  1. 定义:利用数组来顺序结构存储数据元素的线性表;
    特点:逻辑地址与物理地址结构相同;
  2. 顺序存储结构下,对线性表六中操作的实现

2.2 链式存储(链表)

定义:利用指针方式实现的线性表称为链表(单链表,循环链表,双链表)。
特点:逻辑上相邻的数据元素不要求在物理位置上相邻

2.2.1 单链表

  1. 定义:每个结点只含有一个链域(即指针域)的链表。即:利用单链域的方式存储线性表的逻辑结构;
  2. 结构:单链表:SLinkList
  3. 对单结点:有数字域和指针域
    代码创建结点
typedef struct Node
{
	int data;
	struct Node *pNext;
}NODE, *pNODE;
 

4.利用单链表存储结构实现链表

#ifndef _SINGLY_LINKED_LIST_H_H
#define _SINGLY_LINED_LIST_H_H
 
//设计节点结构
typedef struct Node
{
	int data;
	struct Node *pNext;
}NODE, *pNODE;
 

//创建单向链表
pNODE CreateSgLinkList(void);
 
//打印单向链表
void TraverseSgLinkList(pNODE pHead);
 
//判断单向链表是否为空
int IsEmptySgLinkList(pNODE pHead);
 
//计算单向链表的长度
int GetLengthSgLinkList(pNODE pHead);
 
//向单向链表插入节点
int InsertEleSgLinkList(pNODE pHead, int pos, int data);
 
//从单向链表删除节点
int DeleteEleSgLinkList(pNODE pHead, int pos);
 
//删除整个链表,释放内存
void FreeMemory(pNODE *ppHead);
 
#endif

//创建单向链表
pNODE CreateSgLinkList(void)
{
	int i, length, data;
	pNODE p_new = NULL, pTail = NULL;
	//创建头节点,头结点是第0个节点,后面的节点从1开始计数
	pNODE pHead = (pNODE)malloc(sizeof(NODE));
 
	if (NULL == pHead)
	{
		printf("内存分配失败!\n");
		exit(EXIT_FAILURE);
	}
 
	pHead->data = 0;
	pHead->pNext = NULL;
	pTail = pHead;
 
	printf("请输入要创建链表的长度:");
	scanf("%d", &length);
 
	for (i=1; i<length+1; i++)
	{
		p_new = (pNODE)malloc(sizeof(NODE));
		if (NULL == p_new)
		{
			printf("内存分配失败!\n");
			exit(EXIT_FAILURE);
		}
 
		printf("请输入第%d个节点的值:", i);
		scanf("%d", &data);
 
		p_new->data = data;
		p_new->pNext = NULL;
		pTail->pNext = p_new;
		pTail = p_new;
	}
	return pHead;
}

//打印单向链表,不打印头结点的值。
void TraverseSgLinkList(pNODE pHead)
{
	pNODE pt = pHead->pNext;
 
	printf("打印链表:");
	while (pt != NULL)
	{
		printf("%d ", pt->data);
		pt = pt->pNext;
	}
	putchar('\n');
}

//删除整个单向链表,释放内存。
void FreeMemory(pNODE *ppHead)
{
	pNODE pt = NULL;
	while (*ppHead != NULL)
	{
		pt = (*ppHead)->pNext;
		free(*ppHead);
		*ppHead = pt;
	}
}

2.2.2 循环链表

  1. 定义:是一种首尾相连的单链表;即在单链表中,将尾结点的指针域NULL改为指向PHead,就得到单链表形式的循环链表。(一般情况下,就直接使用尾指针来表示循环单链表)
  2. 代码实现线性表操作

2.2.3 双链表

  1. 定义:每个结点含有两个链域(指针域)的链表。即利用双链表的方式存储线性表的逻辑结构。
  2. 结构:示意图(画图最形象)
  3. 代码实现操作

练习部分

未完待续…

发布了26 篇原创文章 · 获赞 2 · 访问量 799

猜你喜欢

转载自blog.csdn.net/li_kin/article/details/103903046