线性表的链式操作

1.1 定义(主要针对单链表)

单链表中的结点可定义为

    typedef struct LNode{
            ElemType data;
            struct LNode *next;
    }LNode, *LinkList;

1.2 单链表的建立

可以采用两种方式建立单链表。

1.2.1 头插法建立单链表

    LinkList CreateList1(LinkList &L)
    {
        LNode *s; int x;
        L = (LinkList)malloc(sizeof(LNode));
        L-next = NULL;
        scanf("%d",&x);
        while(x != 9999)
        {
            s = (LinkList)malloc(sizeof(LNode));
            s->data = x;
            s->next = L-next;
            L-next = s;
            scanf("%d",&x);
        }   
        return L;
    }

1.2.2 尾插法建立单链表

    LinkList CreateList2(LinkList &L)
    {
        int x;
        L = (LinkList)malloc(sizeof(LNode));
        LNode *s, *r = L;
        scanf("%d",&x);
        while(x != 9999)
        {
            s = (LinkList)malloc(sizeof(LNode));
            s->data = x;
            r->next = s;
            r = s;
            scanf("%d",&x);
        }
        r->next = NULL;
        return L;
    }

1.3 典型例题

  1. 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。

    采用递归实现;

      终止条件:f(L,x) = 不做任何事情;   若L为空表
    
      递归主体 :   f(L,x) =删除*L结点;f(L->next,x);   若L->data == x
    
                         f(L,x) = f(L->next,x);      其他情况
    

    代码如下:

    void  Del_X_3(Linklist &L, Elemtype x)
    {
            LNode* p;
            if(L == NULL)
                 return;
            if(L->data == x)
            {
                  p = L;
                  L = L->next;
                  free(p);
                  Del_X_3(L,x);
            }
            else
                 Del_X_3(L->next,x);
    }
    
  2. 在带头结点的单链表L中,删除所有值为x(或者x在某一区间,只需修改if条件即可)的结点,并释放空间,假设值为x的结点不唯一。

        代码如下:
    
        void Del_X_1(LinkList &L, ElemType x)
        {
                LNode* p = L->next, *pre = L, *q;
                while(p !=NULL)
                {
                    if(p->data == x)
                    {
                        q = p;
                        pre->next = p->next;
                        p = p->next;
                        free(q);
                    }
                    else
                    {
                        pre = p;
                        p = p->next;
                    }
                }
        }
    

也可采用尾插法实现,代码如下:

    void Del_X_2(LinkList &L, ElemType x)
    {
        LNode* p = L->next, *r = L, *q;
        while(p !=NULL)
        {
            if(p->data != x)
            {
                r->next = p;
                r = p;
                p = p->next;
            }
            else
            {
                q = p;
                p = p->next;
                free(q);
            }
        }
    }

3.单链表就地逆置

代码如下:

    LinkList reverse(LinkList L)
    {
        LNode *pre,*p = L->next,*r = p->next;
        p->next = NULL;
        while(r != NULL)
        {
            pre = p;
            p = r; 
            p->next = pre;
            r = r->next;
        }
        L-next = p;
        return L;
    }

4 带头结点的单链表递增有序

代码如下:

    void sort(LinkList &L)
    {
        LNode *p = L->next,*pre;
        LNode *r = p->next;
        p-next = NULL;
        while(p != NULL)
        {
            r = p->next;
            pre = L;
            while(pre->next != NULL && pre-next->data < p->data)
                pre = pre-next;
            p->next = pre->next;
            pre->next = p;
            p = r;
        }
    }

5 合并两个递增有序的链表

    void MergeList(LinkList &La, LinkList &Lb)
    {
        LNode *r,*pa = La->next, *pb = Lb->next;
        La->next = NULL;
        while(pa && pb)
        {
            if(pa->data <= pb->data)
            {
                r = pa->next;
                La->next = pa;
                La = pa;
                pa = r;
            }
            else
            {
                r = pb->next;
                La->next = pb;
                La = pb;
                pb = r;

            }
            if(pa)
                pb = pa;
            while(pb)
            {
                r = pb->next;
                La->next = pb;
                La = pb;
                pb = r;
            }
            La->next = NULL;
            free(Lb);
        }
    }

参考:王道考研系列-数据结构联考复习指导 2017。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值