数据结构单链表的代码实现

目录

一、单链表定义

1.结构体定义

二、操作函数(以带有头结点链表为例)

1.创建一个链表:使用函数返回一个头结点指针即可

2.创建一个结点:类似于创建一个链表(头结点),原理一样

3.头插法建立一个单链表

4.尾插法建立单链表

5.按照序号返回结点,0看做头结点,1位元素结点

6.按照元素值返回第一个为该值的结点

7.在第i个位置,插入结点

8.删除第i个结点,并用e返回该节点值

9.求表长



一、单链表定义

1.结构体定义

typedef  struct LNode{
     ElemType data;
     LNode *next;
}LNode,*LinkList; //LNode 的时候可以看做是一个结点,LinkList看做是链表头结点代表一个链表

二、操作函数(以带有头结点链表为例)

1.创建一个链表:使用函数返回一个头结点指针即可

LinkList CreatLinkList()
{
    LNode *HeadNode = (LNode*)malloc(sizeof (LNode));
    HeadNode->data=NULL;
    HeadNode->next=NULL;
    return HeadNode;
}

2.创建一个结点:类似于创建一个链表(头结点),原理一样

LNode *CreatNewNode(ElemType e){
    LNode *NewNode = (LNode*)malloc(sizeof (LNode));
    NewNode->data = e;
    NewNode->next=NULL;
    return  NewNode;
}

3.头插法建立一个单链表

void CreatListByHead(LinkList &l)
{
    int x;
    cout<<"请输入你要插入的元素,输入888退出"<<endl;
    cin>>x;
    //输入888时停止插入
    while (x!=888) {
       LNode*NewNode= CreatNewNode(x); //创建一个值为x的新结点
       NewNode->next=l->next;
       l->next=NewNode;
        cin>>x;
    }

}

4.尾插法建立单链表

void CreatListByTail(LinkList &l)
{
    int x=0;
    LNode *t =l; //尾插法时,避免每次都遍历到最后一个结点,使用这个t为尾指针始终指向尾结点,方便插入
    cout<<"请输入你要插入的元素,输入888退出"<<endl;
    cin>>x;
    while (x!=888) {
       LNode*NewNode= CreatNewNode(x);
       t->next=NewNode;
       t=NewNode;
        cin>>x;
    }

}

5.按照序号返回结点,0看做头结点,1位元素结点

LNode *GetElem(LinkList l, int i)
{
    if(i==0) return  l; //0 返回头结点
    if(i<0) return  NULL;
    LNode *p = l->next; //让p指向第一个元素结点

    for(int j=1;j<i;j++) //这里可以想象,假设i=1的时候,就进不去这个循环,直接返回p,p已经指向第一个结点
        p=p->next;
    return  p;
}

6.按照元素值返回第一个为该值的结点

LNode *locateElem(LinkList l, ElemType e)
{
    LNode *p=l->next;  //p指向第一个元素
    while (p!=NULL and p->data!=e)
        p=p->next;
    return  p;
}

7.在第i个位置,插入结点

bool LinkListInsert(LinkList &l, int i, ElemType e)
{
    LNode *p = GetElem(l,i-1); //在第i个位置插入,需要找到第i-1个结点
    LNode *NewNode = CreatNewNode(e);
    NewNode->next = p->next;
    p->next = NewNode;
    return true;
}

8.删除第i个结点,并用e返回该节点值

bool LinkListDelete(LinkList &l, int i, ElemType &e)
{
    if(i<1) return  false;
     LNode *p=GetElem(l,i-1);//找到第i-1结点
     e=p->next->data;//用e返回要删除的结点值
     LNode *q =p->next;//临时存储要删除结点,以便后续free
     p->next = q->next;
     free(q );
}

9.求表长

int GetLinkListLen(LinkList l)
{
    int i=0;
    LNode *p=l;
    while (p->next!=NULL) {
        i++;
        p=p->next;  //这里注意顺序,先增长再移动
    }
    return i;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值