数据结构之链表

一.链表
1.定义:
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
2.头插法
LinkList List_HeadInsert(LinkList &L,ElemType x){
LNode *s;
s=(LNode *)malloc(sizeof(LNode));
//s=new LNode;
s->data=x;
s->next=L->next;
L->next=s;
return L;
}
3.尾插法:
LinkList List_TailInsert(LinkList &L,ElemType x){
LNode *s;
LNode *p=L->next;
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=null;
while§
p=p->next;
p=s;
return L
}
4.按序号查找节点
LNode *GetElem(LinkList L,int i){
int j=1;
LNode *p=L->next;
if(i==0)
return L;
if(i<1)
return null;
while(p&&j<i){
p=p->next;
j++;
}
return p;
}
5.按值查找节点
LNode *LocateElem(LinkList L,ElemType e){
LNode *p=L->next;
while(p&&p->data!=e)
p=p->next;
return p;
}
6.在具体位置处操作:
LinkList BeforeInsert(LinkList &L,int i,ElemType e){
LNode *p,*r;
p=(LNode *)malloc(sizeof(LNode));
p->data=e;
r= GetElem(L,i-1);
p->next=r->next;
r->next=p;
return L;
}
7.在某节点前面插入:
LinkList LaterInsert(LinkList &L,ElemType x,ElemType e){
LNode *p,*r;
ElemType term;
p=(LNode *)malloc(sizeof(LNode));
p->data=e;
r=LocateElem(L,x);
p->next=r->next;
r->next=p;
term=r->data;
r->data=p->data;
p->data=term;
}
8.删除指定位置的节点:
LinkList DeleteLnode(LinkList &L,int i){
LNode *p,*r;
p=GetElem(L,i-1);
r=p->next;
p->next=r->next;
free®;
return r;
}

9.删除指定值的节点:
LinkList DeleteElem(LinkList &L,ElemType e){
LNode *p,*r;
p=LocateElem(L,e);
r=p->next;
p->data=r->data;
p->next=r->next;
free®;
return L;
}
10.求链表长度:
int LengthLinkList(LinkList L){
int n=0;
LNode *p=L->next;
while§{
n++;
p=p->next;
}
return n;
}
二.双链表
1.定义
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinkList;

2.插入操作:头插法
DLinkList List_HeadInsert (DLinkList &D,ElemType x){
DNode *s,*p=D;
s=new DNode;
//s=(DNode *)malloc(sizeof(DNode));
s->data=x;
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
return D;
}
3.插入操作:尾插法
DLinkList List_TailInsert(DLinkList &D,ElemType x){
DNode *p=D;
DNode *s;
s=new DNode;
s->data=x;
while(p->next){
p=p->next;
}
p->next=s;
s->prior=p;
s->next=null;
return D;
}
4.删除指定值的节点
DLinkList DeleteElem(DLinkList &D,ElemType x){
DNode *p,*r;
p=LocateDNode(L,x);
r=p->prior;
r->next=p->next;
p->next->prior=r;
free§;
return D;
}
三.循环单链表:最后一个节点不是null,而是指向头节点
四.循环双链表:头节点的prior指针指向表尾节点,尾节点的next为L,当循环双链表为空表时,头节点的prior,next都为L。
五.静态链表
定义:
#define MaxSize 100
typedef struct{
ElemType data;
int next;
}SLinkList[MaxSize];
静态链表以next==-1作为结束的标志,借助数组来描述线性表的链式存储结构

#大学生一枚,写微博只为提升自己,交志同道合的朋友,有兴趣关注微信公众号:飞享

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值