您的位置:首页 > 理论基础 > 数据结构算法

单向链表的操作

2016-10-31 18:47 260 查看
上一篇博客解决了链表的建立和打印的问题,现在来解决单向链表里的其他操作

包括求表长、按值查找、按序查找、添加、删除等,都在下面的C语言程序里给出

#include <stdio.h>
#include <stdlib.h>

typedef struct Node *PtrToNode;
struct Node {
int Data;
PtrToNode   Next;
};

PtrToNode Read();
void Print( PtrToNode L );
int length(PtrToNode ptrl);
PtrToNode findkth(int k ,PtrToNode ptrl);
//按值查找
PtrToNode find(int X,PtrToNode ptrl);
//插入操作
PtrToNode insert(int X,int i,PtrToNode ptrl);
PtrToNode del(int i,PtrToNode ptrl);

int main()
{
PtrToNode L1;
L1 = Read();
Print(L1);
int len=length(L1);
printf("%d\n",len);
PtrToNode L2=insert(3,3,L1);
Print(L2);
PtrToNode L3=del(3,L2);
Print(L3);
PtrToNode L4=insert(3,7,L3);
Print(L4);
PtrToNode L5=del(7,L3);
Print(L5);

return 0;
}

PtrToNode Read()
{
int num = 0;
PtrToNode h = NULL;
PtrToNode last = NULL;
scanf( "%d",&num );

if(num<=0)
return NULL;

else{
h = ( PtrToNode )malloc( sizeof( struct Node ) );//建立头结点
h->Data=num;
h->Next = NULL;
last = h;
scanf( "%d",&num );
while(num>0){
PtrToNode node = ( PtrToNode )malloc( sizeof( struct Node ) );
node->Data = num;
node->Next = NULL;
last->Next = node;
last = node;
scanf( "%d",&num );
}
return h;
}
}
void Print( PtrToNode L )
{
if(L==NULL){
printf("NULL\n");
return;
}
while(L!=NULL){
printf("%d ",L->Data);
L=L->Next;
}
putchar('\n');
}

//求表长
int length(PtrToNode ptrl){
PtrToNode p=ptrl;
int j=0;
while(p){
p=p->Next;
j++;
}
return j;
}

//按序号查找
PtrToNode findkth(int k ,PtrToNode ptrl){
PtrToNode p=ptrl;
int i=1;
while(p!=NULL&&i<k){
p=p->Next;
i++;
}
if(i==k)return p;
else return NULL;
}

//按值查找
PtrToNode find(int X,PtrToNode ptrl){
PtrToNode p=ptrl;
while(p!=NULL &&p->Data!=X)
p=p->Next;
return p;
}

//插入操作
PtrToNode insert(int X,int i,PtrToNode ptrl)
{
PtrToNode p,s;
if(i==1){
s=(PtrToNode)malloc(sizeof(struct Node));
s->Data=X;
s->Next=ptrl;
return s;
}
p=findkth(i-1,ptrl);
if(p==NULL){
printf("参数i错误");
return NULL;
}
else{
s=(PtrToNode)malloc(sizeof(struct Node));
s->Data=X;
s->Next=p->Next;
p->Next=s;
return ptrl;
}
}
//删除操作
PtrToNode del(int i,PtrToNode ptrl){
PtrToNode p,s;
if(i==1){
s=ptrl;
if(ptrl!=NULL)ptrl=ptrl->Next;
else return NULL;
free(s);
return ptrl;
}
p=findkth(i-1,ptrl);
if(p==NULL){
printf("第%d个节点不存在",i-1);return NULL;
}else if(p->Next==NULL){
printf("第%d个节点不存在",i);return NULL;
}else{
s=p->Next;
p->Next=s->Next;
free(s);
return ptrl;
}
}
执行结果如下图



至此完成单向链表的操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 数据结构