线性表的定义
表ADT
(1)数据元素:单值元素、记录型元素
(2)唯一直接前驱、直接后继。是否按关键字有序排列
(3)操作:生成、清除、查找、插入、删除、排序等
线性表的顺序存储
1. 线性表的顺序存储结构:把线性表的结点一次存储在一组地址连续的存储单元中。
2. 线性表的特点:
(1)线性表的逻辑顺序与物理存储顺序一致
(2)相邻元素之间无空隙
(3)已知基地址可以计算任意元素地址
线性表的链式表示和实现
单链表
结点的描述
typedef struct Lnode
{
ElemType data;//数据域、保存结点的值
struct Lnode *next;//指针域
}Lnode;//结点类型
结点的实现
结点是通过动态分配和释放来的实现,即需要时分配,不需要时释放。实现时是分别使用C语言提供的标准函数:malloc() ,realloc(),sizeof() ,free()
单链表是由表头唯一确定,因此单链表可以用头指针的名字来命名
动态分配: p=(LNode*)malloc(sizeof(LNode));
函数malloc分配了一个类型为LNode的结点变量的空间,并将其首地址放入指针变量p中。
动态释放 free(p) ;
系统回收由指针变量p所指向的内存区。P必须是最近一次调用malloc函数时的返回值。
常用的基本操作及其示意图
单链表
线性表的基本操作
/*创建单线性链表*/
//头插入法创建单链表,链表的头结点head作为返回值
Lnode *create_LinkList(void)
{
int data;
Lnode *head,*p;
head =(Lnode *)malloc(sizeof(Lnode));
head->next=NULL;
//创建链表的头结点head
while (1)
{
scanf("%d",&data);
if (data==32767) break;
p=(Lnode *)malloc(sizeof(Lnode));
p->data=data;
//数据域赋值
p->next=head->next;
head->next=p;
//新创建的结点总是作为第一个结点
}
return (head);
}
(2)单链表的查找
按序号
按值
(3)单链表的插入
(4)单链表的删除
(5)有序单链表的合并
双向链表