目录
1、特点
(1)通过一组任意的存储单元来存储线性表中的数据元素。
(2)是非随机存取的存储结构;不能直接找到标表中的某个特定的节点,需要从表头开始遍历,依次查找。
(3)通常用头指针来标识一个单链表,如单链表L,头指针为空则表示一个空表。
2、基本类型的定义
//单链表的定义
typedef struct LNode{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
3、基本操作的实现
(1)建立单链表
头插法(带头节点)
//头插法建立单链表
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int data_insert;
L = (LinkList)(malloc(sizeof(LNode))); //创建头节点
L->next = NULL;
cin>>data_insert;
while(data_insert != 9999) {
s=(LNode*)(malloc(sizeof(LNode))); //创建一个新的节点,s指向这个新节点的起始位置
s->data=data-insert;
s->next=L->next;
L->next=s; //将新节点插入表中,L为头指针
cin>>data_insert;
}
return L;
}
时间复杂度为O(n)
头插法(不带头结点)
//头插法建立单链表 (不带头结点)
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int data_insert;
cin>>data_insert;
while(data_insert != 9999) {
s=(LNode*)(malloc(sizeof(LNode))); //创建一个新的节点,s指向这个新节点的起始位置
s->data=data_insert;
if(L==NULL){ //如果单链表为空,则将s作为首节点
L=s;
}
else{ //将s插入第一个节点之前
s->next=L;
L=s;
}
cin>>data_insert;
}
return L;
}
时间复杂度为O(n)
尾插法(带头结点)
//尾插法建立单链表(带头结点)
LinkList List_TailInsert(LinkList &L){
LNode *s,*r; //s为数据节点,r表示表尾指针
int data_insert;
L=(LinkList)(malloc(sizeof(LNode)));
r=L;
cin>>data_insert;
while(data_insert!=9999){
s=(LNode*)(malloc(sizeof(LNode)));
s->data=data_insert;
r->next=s;
r=s; //r指向新的表尾指针
cin>>data_insert;
}
r->next=NULL;
return L;
}
时间复杂度为O(n)
尾插法 (不带头结点)
//尾插法建立单链表(不带头结点)
LinkList List_TailInsert01(LinkList &L){
LNode *s,*r; //s为数据节点,r表示表尾指针
int data_insert;
L=NULL;
r=L;
cin>>data_insert;
while(data_insert!=9999){
s=(LNode*)(malloc(sizeof(LNode)));
s->data=data_insert;
if(r==NULL){ //创建单链表的第一个节点
L=s;
r=s;
s->next=NULL;
}
else{
r->next=s;
r=s;
}
cin>>data_insert;
}
r->next=NULL;
return L;
}
(2)按序号查找结点
//按序号查找结点值
LNode* GetElem(LinkList L,int i){
LNode *p=L->next;
int j = 1; //计数,初始为1
if(i==0){
return L;
}
else if(i<0){
return NULL;
}
else{
while(p&&j<i){ //从第一个结点开始查找
p=p->next;
j++;
}
}
return p;
}
时间复杂度为O(n)
(3)按值查找结点
//按值查找
LNode* LocateElem(LinkList L,int e){
LNode *p=L->next;
while(p&&p->data!=e){ //从第一个结点开始查找元素为e的结点
p=p->next;
}
return p;
}
时间复杂度为O(n)
(4)插入结点
//插入结点的操作
LinkList ListInsert(LinkList L,int i,LNode *s){
int data; //插入的数据
LNode *p=GetElem(L,i-1); //p指向插入位置的前驱节点
s=(LNode*)(malloc(sizeof(LNode)));
cin>>data;
s->data=data;
s->next=p->next;
p->next=s;
return L;
}
(5)删除结点
//删除结点的操作
LinkList ListDelete(LinkList &L,int i){
LNode *p,*q;
p=GetElem(L,i-1); //p指向删除位置的前驱节点
q=p->next;
p->next=q->next;
free(q);
return L;
}
时间复杂度为O(n)