这里写目录标题
定义:
线性表的链式存储又称单链表
即:通过一组任意的存储单元来存储线性表当中的数据元素,数据元素存储的位置不一定是连续的。
(有可能连续,有可能不连续)
存取方式:
通过指针实现线性的逻辑关系
链表不能实现随机存取,且每个元素包含两部分,
① data 即元素值
② *next 即下一个元素的存储地址
所以,我们也可以使用一个指针用来表示单链表
单链表的两种实现形式:
不带头结点
带头结点(优)
单链表的基本操作:
头插法建立单链表:
s -> next = L -> next;
L -> next = s;
头插法建立单链表:时间复杂度O(n)
LinkList List_HeadInsert(LinkList &L){
LNode *s;int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
尾插法建立单链表:
r -> next = s;
r = s;
尾插法建立单链表:时间复杂度O(n)
LinkList List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L;
scanf("%d",&x);
while(x!=9999){
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return L;
}
按序号查找&按值查找:
两种查找均要遍历单链表,仅比较的数据不同
.
按序号查找需要给遍历元素计数,从而找到要找的元素
.
按值查找需要比对每个元素的属性值是否与要找的元素相同
按序号查找&按值查找:时间复杂度O(n)
按序号查找:
LNode *GetElem(LinkList L,int i){
int j=1;
LNode *p=L->next;
if(i==0) return L;
if(i<1) return NULL;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
按值查找:
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
}
return p;
}
插入:
p = GetElem(L, i - 1);
s -> next = p -> next;
p-> next = s ;
插入操作:
前插法
在第 i 个位置前插入元素
前插法:
前插法:时间复杂度O(n)
后插法
在第 i 个位置后插入元素
后插法:
后插法:时间复杂度O(1)
可以利用后插法实现前插法
.
先在第 i 个位置插入元素 e
.
然后交换第 i 个位置和第 i - 1 个位置的值
删除:
删除第i个元素
p = GetElem( L, i - 1 );
q = p -> next;
p -> next = q -> next;
free(q);
删除给定节点 *p
q=q->next;
p->data=p->next->data;
p->next=q->next;
free(q);
求表长:
求表长:时间复杂度O(n)
int count=0;
p=head;
while(p->next!=NULL){
count++;
p=p->next;
}