线性表

数据结构:线性表(链表,顺序表)(栈,队列,串),树型结构(二叉树),网状结构
算法:排序,查找,动态内存管理
存储方式:1,顺序存储(逻辑相邻且物理相邻)i++;*p++
2,链式存储(逻辑相邻但物理不一定相邻)
前驱(前面一个) 后继(后面一个) 如数组a[1][1]和a[1][2]
时间复杂度,空间复杂度
线性表:头没有前驱,尾没有后继,中间的元素有唯一的前驱和后继
根据存储方式分为:顺序线性表,链式线性表。
数组:存数组,读数据,长度(增加减少比较困难)
**

一,顺序表**存,读,增加,删除

1,定长顺序表(将elem和length处理妥当)
看见pos 范围一定要注意
{
int elem[SIZE];//存放数据(仓库)
int length;//有效数据的个数(判断有没有数据)
}

InitSeqList(PSeqList plist);
bool Insert(PSeqList plist, int val, int pos);
int Search(PSeqList plist, int key);
bool DeleteVal(PSeqList plist, int key);
bool DeletePos(PSeqList, int pos);
bool SetPos(PSeqList plist, int pos, int newVal);
void Show(PSeqList plist);
void Clear(PSeqList plist);
void Destroy(PSeqList plist);

2.不定长顺序表(比不定长顺序表多了一个总容量)

{
int *elem;//指向动态创建的内存,用于存储数据
int length;//有效数据个数
int listsize;//总容量(总格子数)动态内存的总格子数
}

void InitSeqList(PDSeqList plist);
static bool IsFull(PDSeqList plist);注意
static bool Inc(PDSeqList plist);注意
 bool Insert(PDSeqList plist, int val, int pos);
int Search(PDSeqList plist, int key);
bool DeleteVal(PDSeqList plist, int key);
bool DeletePos(PDSeqList, int pos);
int GetLength(PDSeqList plist);
int GetElem(PDSeqList plist, int pos);
bool SetPos(PDSeqList plist, int pos, int newVal);
void Show(PDSeqList plist);
void Clear(PDSeqList plist);
void Destroy(PDSeqList plist);

顺序表和单链表性能对比:
一,插入:
1,顺序表:头插(O(n)需要将后面的值后移) 中间插入(O(n)) 尾部插入(O(1))
2, 链表:头插(O(1)不需要移后面数据) 中间插入(O(1)) 尾部插入(O(1))
二,删除:
1,顺序表:头删(O(n)需要将后面的值后移) 中间删除:(O(n)需要将后面的值后移)尾部删除(O(1))
2,链表:头删:(O(1)不需要移后面数据) 中间删除:O(1)不需要移后面数据) 尾部删除(O(1))
三,随机访问能力:
1,顺序表:(O(1))通过下标直接访问
2,链表:(O(n))必须从头开始遍历

二,单链表

链表操作注意:
1,找后一个节点是p=p->next;不能写成p++;
2,边界处理干净
遍历链表的形式
for(p=plist;p->next!=NULL;p=p->next);
需要修改链表结构(前驱)的操作,例如插入,删除
for(p=plist->next;p!=NULL;p=p->next);
不需要修改链表结构,只是遍历所有数据数据节点,例如查找,输出,求长度
1,单链表
带头节点的单链表,为节点的指针域为空指针NULL
重点:逆置和DeleteVal
头节点:开头标识,类似旗帜,不存放数据,不参与运算, 存放第一个节点的地址只有地址没有数据)

{
int data;
struct Node *next;
}

void InitList(List plist);
bool Insert_head(List plist, int val);头插
bool Insert_tail(List plist, int val);尾插
Node *Search(List plist, int key);
bool IsEmpty(List plist);判空
bool DeleteVal(List plist, int key);**重点**
int Getlength(List plist)
bool SetPos(List plist, int pos, int newVal);
void Show(List plist);
void Clear(List plist);
void Destroy(List plist);
void Reverse(List plist);**逆置,重点**

2.单循环链表(带头节点)
{
int data;
struct CNode *next;
}

void InitList(CList plist);
bool Insert_head(CList plist, int val);头插
bool Insert_tail(CList plist, int val);尾插
CNode *Search(CList plist, int key)
bool IsEmpty(CList plist);判空
bool DeleteVal(CList plist, int key);
int Getlength(CList plist);
bool SetPos(CList plist, int pos, int newVal);
void Show(CList plist);
void Clear(CList plist);
void Destroy(CList plist);

3,双向链表(带头节点,不循环)
{
int data;
struct DNode *next;后继指针
struct DNode *prio;前驱指针
}

void InitList(DList plist);
bool Insert_head(DList plist, int val);
bool Insert_tail(DList plist, int val);
DNode *Search(DList plist, int key);
bool IsEmpty(DList plist);
bool DeleteVal(DList plist, int key);
int Getlength(DList plist)
bool SetPos(DList plist, int pos, int newVal);
void Show(DList plist);
void Clear(DList plist);
void Destroy(DList plist);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值