目录
线性表
在计算机科学中,线性结构被称为线性表
线性表是在数据元素的非空集合中:
①存在唯一的一个首元素;
②存在唯一的一个尾元素;
③除首元素外每个元素有且只有一个直接前驱;
④除尾元素外每个元素有且只有一个直接后续;
按存储方式分为顺序存储与链式存储
线性表的基本操作有:
初始化、插入、删除、遍历(即访问每一个元素,如打印所有信息)、查找、排序
顺序存储结构
顺序存储结构:用一组地址连续的存储单元 依次存放线性表的所有数据元素
特点1:逻辑关系上相邻的两个元素在物理位置上也相邻,因此,可以直接存取表中任意一个元素
特点2(缺点):①存储空间闲置、存储容量难以扩充;②当进行插入和删除操作时,存在大量数据元素移动
链式存储结构
链式存储结构:①在链式存储结构中,数据元素的存储单元是不连续的。每个元素除自身信息外,还需要存储其后续元素的信息
②每个元素的存储映像称为结点,存放数据元素信息的域称为数据域,存放后续结点存储位置的域称为指针域,每个结点由数据域和指针域构成
③用指针相连的结点序列称为链表
单链表
单链表定义
链表,别名链式存储结构或单链表,用于存储逻辑关系为 “一对一” 的数据。链表中每个数据的存储都由以下两部分组成:
1.数据元素本身,其所在的区域称为数据域。
2.指向直接后继元素的指针,所在的区域称为指针域。
单链表存储结构中,有一首指针head指示链表中第一个结点的存储位置,同时,由于最后一个元素没有直接后续,所以单链表最后一个结点的指针域为空(NULL),而当head为NULL时,head所指向的单链表为空表,其表长length=0
单链空表逻辑状态图如下:
单链表一般逻辑状态图如下:
单链表基本操作(仅供参考)
单链表结构体定义
//单链表的结构定义
typedef struct list
{
int data; //存放数据的地址
struct list *next;
}LIST_T;
单链表的初始化(创建头结点)
LIST_T*List_Init(int data)
{
LIST_T * head;
head = (LIST_T *)malloc(sizeof(LIST_T));
head->data=data;
head->next=NULL;
return head;
}
单链表的插入
void List_Add(LIST_T *head,int data)
{
LIST_T *pNode,*p1=head;
pNode=(LIST_T *)malloc(sizeof(LIST_T ));
while(p1->next != NULL )
{
p1=p1->next; //遍历链表,找到最末尾的节点
}
p1->next=pNode;
pNode->data=data;
pNode->next=NULL;
}
单链表结点位置的删除
//删除单链表中第index位置上的结点
int List_Del(LIST_T * head,int index)
{
LIST_T * p1;
LIST_T * p2; //要删除结点的临时结点
int nCount = 0;
p1=head;
while(p1->next != NULL)
{
if(nCount == index)
{
p2 = p1->next;
p1->next = p1->next->next;
free(p2);
}
p1=p1->next;
nCount++;
}
return nCount;
}
单链表修改结点
// 修改单链表L的第index个位置上的结点
void replace(LIST_T *head, int index, int data)
{
LIST_T * p1;
int nCount = 0;
p1=head;
while(p1->next != NULL)
{
if(nCount == index)
{
p1->data = data;
break;
}
p1=p1->next;
nCount&