链表的基本操作算法,直接参照部分代码:
链表的创建,分为两种,一种是队尾插入,一种是队头插入:
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode;
//创建链表(头插入法)
LNode *create_LinkList_Head()
{
int data;
LNode *head, *p;
head = (LNode *)malloc(sizeof(LNode));
head->next = NULL;//创建头结点
while(1){
scanf("%d",&data);
if(data == 32767)
break;
p->data = data;
p->next = head->next;
head->next = p;
}
//钩链,新建的节点是头结点
return head;
}
//创建链表(尾插入法)
Lnode *create_LinkList_Tail()
{
int data;
LNode *head, *p ,*q;
head = q = (LNode*)malloc(sizeof(LNode));
q->next =NULL;
while(1){
scanf("%d",&data);
if(data == 32767)
break;
p = (LNode*)malloc(sizeof(LNode));
p->data= data;
p->next = q->next;
p=q->next;
q=p;
//钩链,新建的节点是最后一个节点
}
return head;
}
对于单链表,如果没有明确指出直接后继,那么钩链的次序必须是:先右后左。
对于单链表的查找同样有两种方式:按照位置查找和按照值来查找。
首先来看按照位置查找:
//按照序号查找
ElemType Get_Elem(LNode *l,int i)
{
int j = 0;
LNode *p;
p=l->next;
for(j=0;j<i;j++){
if(p->next = NULL)
return ERROR;
p=p->next;
}
return p->data;
}
链表不像之前的顺序表,直接按照位置i就能找到相应的元素,而是需要从链表的头出发,依次查找,直到找到对应的元素为止。就查找来说,单链表的复杂度比顺序存储表时间度要复杂。
按照值来查找:
//按照值查找
LNode *Get_Position(LNode *l, ElemType key)
{
LNode *p;
for( p=l->next;p;p=p->next){
if(key == p->data)
return p;
}
return NULL;
}
按照值来查找,也是同样需要从链表的头结点出发,依次比较:
//按照值查找
LNode *Get_Position(LNode *l, ElemType key)
{
LNode *p;
for( p=l->next;p;p=p->next){
if(key == p->data)
return p;
}
return NULL;
}
单链表的插入需要知道插入位置和插入元素,之前介绍过链表的一些钩链操作。其实插入就是先查找,再钩链的过程。具体可以参照如下code:
//链表插入元素e到i位置
void Insert_ElemType(LNode *l, int i, ElemType e)
{
LNode *p = l->next;
for(int j=0;j<i;j++)
{
if(p==NULL)
return NULL;
p = p->next;
}
LNode q = (LNode *)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
}
同样,删除操作就是先查找再断链,然后释放的过程。切记删除元素一定要释放内存:
//按位置序号删除元素
void Delete_ElemType(LNode *l,int i)
{
LNode *p=l;
LNode *q=l->next;
for(int j=0;j<i;j++)
{
if(p==NULL)
return NULL;
p=q;
q = q->next;
}
p->next = q->next;
free(q);
}
//按照值删除元素
void Delete_Elem(LNode *l, ElemType e)
{
LNode *p=l;
LNode *q=l->next;
for( ;p;p->next) {
p = q;
q = q->next;
if(p->data == key)
break;
}
p->next = q->next;
free(q);
}