单链表的基础操作
求单链表的长度
遍历单链表 用n记录遍历单链表的个数 就是单链表的长度;不计头结点的单链表算法
int ListLenght(Linknode *L)
{
Linknode *p=L;//p指向头结点
int n=0;//用n来计数单链表的长度
while(p->next!=Null)
{
n++;
p=p->next;//p后移
}
return n;//返回长度n
}
输出单链表
遍历单链表,依次输出每一个值。
void print(Linknode *L)
{
Linknode *p=L->next;//p指向首结点
while(p!=NULL)
{
printf("data:%d",p->data);//输出结点p的data值
p=p->next;//p后移
}
printf("\n");
}
求单链表中i结点元素的值
用一个结点p遍历单链表,用j来计数 用e来返回结点的值 若没有找到i则返回0
int Linknode(Linknode *L,int n)
{
Linknode *p=L;//p指向头结点
if(i<0) return 0;//i错误返回0
int j=0;//p指向头结点时 j=0
while(j<i&&p!=NULL)
{
j++;
p=p->next;
}//寻找i
if(p==NULL) return 0;//不存在i结点返回0
else
{
e=p->data;//找到i 使其值等于e
return e;//返回e
}
}
按元素e找到它的位置 并返回
用p指针遍历单链表,用i记录p的位置最后返回i
若元素不存在返回0
int Linknode(Linknode *L,Elemtype e)
{
Linknode *p=L;//p指向头结点时 i=0
int i=0;
while(p!=NULL&&p->data!=e)
{
i++;
p=p->next;
}//寻找 元素e的位置
if(p==NULL) return 0;//不存在e 则返回0
else
return i;//返回e结点的位置
}
在i位置插入元素e
要在i结点插入结点s,则必须找到它的前继结点(i-1)用指针p来遍历单链表 用j记录结点的位置 i错误则返回0 插入成功则输入1
void Insertnode(Linknode *L,Elem type e)
{
Linknode *p=L;//p指向头结点 j等于0
int j=0;
if(i<0) return 0;//不存在i时 返回0
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}//寻找到i-1的结点
if(p==NULL) return 0;//若不存在i-1的结点 返回0
else
{
Linknode *s=(Linknode *)malloc(sizeof(Linknode))
s->data=e;//创建s结点 将e付给s
s->next=p->next;
p->next=s;//将s插到第i个结点
return 1;//插入成功则返回1
}
}
删除第i个元素
要删除第i个元素 则需要找到i-1个元素,删除后 返回被删除的元素值e 若不存在i则返回0
int Linknode(Linknode *L,int i)
{
Linknode *p=L;//p指向头结点
int j,e;
if(i<0) return 0;//不存在i 返回0
while(j<i-1&&p!=NULL)
{
j++;
p=p->next;
}//寻找 i-1结点
if(p==NULL) return 0;//若不存在i-1 返回0
else
{
Linknode *q;
q=p->next;//令q指向需要删除的结点
if(q==NULL) return 0;//若不存在q则返回0
e=q->data;//用e保存q的data
p->next=q->next;//删除q结点
free(q);//释放q结点
return e;//返回被删节点的值
}
}