05单链表定义、创建、查找、删除、求表长

线性表的链式表示
1、 单链表的定义:
在这里插入图片描述

描述代码:
Typedef struct LNode{
Elemtype data; //数据域
Struct LNode *next;//指针域
}LNode,*LinkList;

2、 单链表上基本操作的实现
1、 采用头插法建立单链表:将读取的数据存在新节点数据中,然后将新节点插入到当前链表的表头。
在这里插入图片描述

描述代码:
LinkList CreatList1(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;
}
特点:读入数据如链表数据相反,时间复杂度为O(n)

2、 采用尾插法建立单链表
将新节点插入到当前链表的表尾上,顺序与读入顺序相同,需要在增加尾指针r.
在这里插入图片描述

描述代码:
LinkList CreatList2(LinkList &L){
//从表头到表尾正向建立单链表L,每次均在表尾插入元素
Int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L; //r为表尾指针
Scanf(“%d”,&x); //输入节点值
While(x!=9999){ //9999表示结束
S=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s; //r指向新的表尾节点
r=s;
scanf(“%d”,&x);
}
r->next=NULL; //尾节点指针置空
return L;
}
时间复杂度O(n)

3、 按序号查找节点值:从第一个结点出发,顺指针next域逐个往下搜索,直到找到第i个结点为止,否则返回最后一个结点的指针域NULL.
描述代码
LNode *GetElem(LinkList L,int i){
Int j=1;//计数,初始为1
LNode *p=L-next; //头结点指针赋给p
If(i==0) return L;//若i等于0返回头结点
If(i<1) return NULL ; //i无效,则返回NULL
While(p&&j<i){
p=p->next;
j++;
}
Return p; //返回第i个结点,如果i大于表长,p=NULL
}
时间复杂度O(n)。

4、 按值查找表结点:由前往后依次比较表中各结点的值,若等于给定值e则返回该结点的值。
描述代码
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L-next;
While(p!=NULL&&p->data!=e){
P=p->nest;
}
Return p;
}
时间复杂度 O(n)
5、 插入结点操作:将值为x的结点插入到单链表的第i个位置上。
在这里插入图片描述

描述代码
p=GetElem(L,i-1);//查找插入位置的前驱结点
s->next=p-next;
p->next=s;
时间复杂度:O(n)

  把新增结点插入到*P之前,描述代码

s->next=p-next; //修改指针
p->next=s;
temp=p->data; //交换数据域
p->data=s->data;
s->data=temp;
6、 删除结点操作:删除第i个结点。查找第i-1个点,在修改指针。
在这里插入图片描述

描述代码:
P=GetElem(L,i-1); //获得前驱结点
q=p->next;
p->next=q->next;
free(q); //释放内存
时间复杂度O(n)
删除*P本身结点
q=p->next;
p->data=p->next->data;
p->next=q->next;
free(q);

求表长:从头结点开始计数,直到指针指向NULL返回i。
int *LocateElem(LinkList L){
LNode *p=L-next;
Int i =0;
While(p!=NULL){
p=p->nest;
i++;
}
Return i;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光怪陆离的节日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值