目录
单链表基础
单链表又可以用头指针表示。
单链表比较顺序表:
1.单链表在插入和删除时不必修改大量的元素。 //优点
2.单链表在查找某一元素时的时间复杂度为O(n),需要从头节点开始。//缺点
3.单链表在插入节点可以随时开辟空间,不必判断长度。//优点
链表节点由data域和next域组成,next域存放的是下个节点的地址。
不含头结点,逻辑结构如下所示,
data | next | |
0 | d1 | n |
n | d2 | m |
m | d3 | NULL |
单链表的基本操作,
1.存储结构的创建
2.查找元素
3.插入元素
4.删除元素
1.存储结构的创建
这里主要强调一下*linklist,专门用于创建头指针,lnode*用来创建指向节点的指针
这里只是规范化定义。
typedef struct lnode{//typedef定义的结构体比较规范
Elemtype data;
struct lnode* next;//类比int*
}lnode,*linklist;
2.查找元素
在单链表中取得第i个元素必须从头指针出发。
status getelem_l(linklist L,int i,elemtype &e){
lnode*p = L->next;j = 1;//指针p用于遍历,j做累加器
while(p&&j<i){
p = p->next;++j;
}
if(!p||j>i)
return ERROR;
e = p->data;
return OK;
}
//status创建的函数要返回值为ERROR,FALSE,TURE,OK
3.插入元素
这块要明白三个指针的作用,还有就是节点连接时的交接。、
p普通指针,用于遍历和接受临时变量
s节点指针,开辟空间存放临时变量
status insert_l(linklist &L,int i,elemtype e){
lnode* p=L;j=0;
linklist s;//结构体指针定义时不分配空间
while(p&&j<i-1){
p=p->next;++j;
}
if(!p||j>i-1)
return ERROR;
s = (linklist)malloc(sizeof(lnode));//由系统生成一个lnode型的节点,将起始位置赋值给指针s
s->data = e;s->next = p->next;
p->next = s;
return OK;
}
4.删除元素
status delete_l(linklist &L,int i){
lnode* p = L;++j;
while(p->next&&j<i-1){//遍历次数要分析清楚
p = p->next;
++j;
}
if(!(p->next)||j>i-1)return ERROR;
q = p->next; p->next = q->next;
free(q);
q = NULL;
return OK;
}
以上是线性表的基本操作,用于个人学习。