task02-线性表
理论部分
1.线性表的定义与操作
1. 1 线性表的定义
线性表(LinearList)是由n个相同数据类型的数据元素a1,a2,a3…an组成的有序序列。表中数据元素个数成为表的长度。除首尾元素之外,其他元素有且仅有一个直接前驱和直接后继来表示位置关系。
1.2 线性表的基本操作
- 随机存取
- 插入操作
- 移除操作
- 查找操作
- 得到操作
- 是否为空
- 清空操作
2.线性表的存储与实现
2.1 顺序存储(顺序表)
- 定义:利用数组来顺序结构存储数据元素的线性表;
特点:逻辑地址与物理地址结构相同; - 顺序存储结构下,对线性表六中操作的实现
2.2 链式存储(链表)
定义:利用指针方式实现的线性表称为链表(单链表,循环链表,双链表)。
特点:逻辑上相邻的数据元素不要求在物理位置上相邻
2.2.1 单链表
- 定义:每个结点只含有一个链域(即指针域)的链表。即:利用单链域的方式存储线性表的逻辑结构;
- 结构:单链表:SLinkList
- 对单结点:有数字域和指针域
代码创建结点
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 循环链表
- 定义:是一种首尾相连的单链表;即在单链表中,将尾结点的指针域NULL改为指向PHead,就得到单链表形式的循环链表。(一般情况下,就直接使用尾指针来表示循环单链表)
- 代码实现线性表操作
2.2.3 双链表
- 定义:每个结点含有两个链域(指针域)的链表。即利用双链表的方式存储线性表的逻辑结构。
- 结构:示意图(画图最形象)
- 代码实现操作
练习部分
未完待续…