数据结构复习(1)线性表

目录

顺序表和链表的区别:

一、顺序表

二、链表:

特点:

头插法:

尾插法:

中间插入:

显示:

中间删:

链表的逆序:


顺序表和链表的区别:

1、顺序表的内存空间连续,而链表的内存空间不连续。

2、顺序表支持随机访问时间复杂度是O(1),链表不支持随机访问,需要遍历。

3、顺序表长度固定,有时需要扩容。链表没有空间限制,不会溢出,可以存储很多元素。

4、在顺序表中间插入或删除元素时都涉及到元素的移动,效率较低,链表插入删除比较方便。

一、顺序表

顺序表的特点

(1)顺序并且连续存储,访问方便

(2)大小固定

(3)表满不能存,表空不能取

优点:访问方便

缺点:插入和删除不方便,需要移动元素

 定义数据元素的类型

假设:做一个超市管理系统,定义一个元素的数据类型

typedef struct shop

{

char name[20];//商品的名字

float price;//商品的价格

int number;//商品的编号

int count;//商品的数量

}data_type;

学生管理系统,定义一个元素的数据类型

typedef struct student

{

char name[20];//姓名

char id[10];//学号

int class;//班级

}data_type;

typedef int data_type;

定义顺序表的数据类型

假设顺序表只能存储10个元素

#define N 10

typedef struct list

{

data_type arr[N];//顺序表最多能存储N个元素

int count;//保存顺序表中的元素的有效个数(count == 0,表为空,count == N,表满)

}List;

二、链表:

特点:

1:申请的空间不连续

2:链表的访问不方便

3:链表的插入和删除比较方便,不需要移动元素

链表的操作:

typedef int data;

typedef struct linknode

{

data_type data;//数据域

struct linknode *pNext;//指针域

}Link;

//1.创建新节点

Link *pNew =(Link *)malloc(sizeof(Link));

//2.根据位置向链表中插入元素

头插法:

pNew->pNext = pHead->pNext;

//3.将新节点插入

pHead->pNext=pNew;

尾插法:

//将新值赋给pNew的数据域

pNew->data =item

//定义一个指针变量,初始化为头节点

Link *pTail =pHead;

//当pTail->pNext不为空时

while(pTail->pNext != NULL)

{

pTail =pTail->pNext;//移动指针

}

//将新节点插入

pTail->pNext=pNew;

中间插入:

//定义一个指针变量,初始化为头结点

Link * pPre = NULL;

//2.找到插入节点的前一个节点

当pPre部位空的情况下,移动pos-1次

while(pPre != NULL &&i<pos -1)

{

pPre = pPre ->pNext;

i++

}

//3.保护好要插入节点的所有节点

pNew->pNext =pPre ->pNext;

//4.将新节点插入进去

pPre->pNext =pNew;

显示:

//1.定义一个指针变量,初始化为首节点

Link *pTmp =pHead->pNext;

//2.if(pTmp!=NULL)

{

printf("%d,pTmp->data");

pTmp=pTmp->pNext;

}

循环2知道pTmp为空为止

中间删:

//1.定义两个指针变量,一个初始化为头结点,一个初始化为首节点

Link *pPre =pHead,Link *pDel =pHead ->pNext;

//2.当pDel不为空的情况下,移动pos-1次

int i =0;

while(pDel !=NULL &&i<pos-1)

{

pPre =pDel;

pDel =pDel->pNext;

i++;

}

//3.保存好要删除的数据

*pData =pDel ->pNext;

//4.保护好要删除节点后的所有节点

pPre->pNext =pDel-> pNext

//5.释放pDel

free(pDel)

pDel=NULL;

链表的逆序:

方法:头删,头插

1、将上述链表裂开,一个是带头结点的链表(链表1),一个是不带头结点的链表(链表2)

Link *pLink =pHead ->pNext;

pHead->pNext =NUll;

2、使用头删法进行删除

2.1找到要删除的节点

Link *pDel =pLink;

2.2保护好要删除节点后的所有节点

pLink =pLink->pNext;

3、使用头插法将pDel插入道链表1中

pDel->pNext =pHead->pNext;

4、将新值插入进去

pHead ->pNext =pDel;

5、循环2-4,直到pDel为空结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值