目录
顺序表和链表的区别:
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为空结束