• 链表基本操作


    1.单链表定义

    //单链表结点类型描述
    typedef struct LNode{
        int data;                //数据域
        struct LNode *next;      //指针域
    }LNode,*LinkList;

    2.单链表基本操作实现

    2.1 头插法建立单链表(逆序)

    //头插法建立单链表
    LinkList List_HeadInsert(LinkList &L,int n)
    {
        LNode *s;
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;
        for(int i=0;i<n;i++)
        {
            cin>>x;
            s=(LNode*)malloc(sizeof(LNode));
            s->data=x;
            s->next=L->next;
            L->next=s;
        }
        return L;
    }

    2.2 尾插法建立单链表(顺序)

    //尾插法建立单链表
    LinkList List_TailInsert(LinkList &L,int n)
    {
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        LNode *s,*r=L;
        for(int i=0;i<n;i++)
        {
            cin>>x;
            s=(LNode*)malloc(sizeof(LNode));
            s->data=x;
            r->next=s;
            r=s;
        }
        r->next=NULL;
        return L;
    }

    2.3 按序号查找结点值

    //按序号查找单链表L(带头结点)中第i个位置结点指针
    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;
    }

    2.4 按值查找表结点

    //按值查找表结点
    LNode *LocateElem(LinkList L,int e)
    {
        LNode *p=L->next;
        while(p!=NULL&&p->data!=e) p=p->next;
        return p;
    }

    2.5 插入结点操作

    //插入结点操作
    /*调用GetElem(L,i-1),查找第i-1个结点,再在其后插入新结点*/
    LinkList InsertNode(LinkList &L,int i)
    {
        LNode *p,*s;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=100;
        p=GetElem(L,i-1);
        s->next=p->next;
        p->next=s;
        return L;
    //    //将*s结点插入到*p结点之前的主要代码
    //    int temp=0;
    //    s->next=p->next;
    //    p->next=s;
    //    temp=p->data;
    //    p->data=s->data;
    //    s->data=temp;
    }

    2.6 删除结点操作

    //删除结点操作
    LinkList DeleteNode(LinkList &L,int i)
    {
        //结点*p为找到的被删除结点的前驱结点
        LNode *p,*q;
        p=GetElem(L,i-1);
        q=p->next;
        p->next=q->next;
        free(q);
        return L;
        //删除结点*p
        //法一:先找到*p的前驱结点,再执行删除操作,时间复杂度为O(n)
        //法二:将*p后继结点值赋予自身,再删除后继结点,时间复杂度为O(1)
    //    q=p->next;
    //    p->data=q->data;
    //    p->next=q->next;
    //    free(q);
    }

     

    3.运行代码

    #include <iostream>
    using namespace std;
    int arr[100];
    
    //单链表结点类型描述
    typedef struct LNode{
        int data;                //数据域
        struct LNode *next;      //指针域
    }LNode,*LinkList;
    
    //头插法建立单链表
    LinkList List_HeadInsert(LinkList &L,int n)
    {
        LNode *s;
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;
        for(int i=0;i<n;i++)
        {
            cin>>x;
            s=(LNode*)malloc(sizeof(LNode));
            s->data=x;
            s->next=L->next;
            L->next=s;
        }
        return L;
    }
    
    //尾插法建立单链表
    LinkList List_TailInsert(LinkList &L,int n)
    {
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        LNode *s,*r=L;
        for(int i=0;i<n;i++)
        {
            cin>>x;
            s=(LNode*)malloc(sizeof(LNode));
            s->data=x;
            r->next=s;
            r=s;
        }
        r->next=NULL;
        return L;
    }
    
    //List_HeadInsert函数+outPutValue函数可实现头插法建立单链表以及逆序输出结点数据值
    /*
    10
    12 23 18 90 32 17 67 45 89 13
    13 89 45 67 17 32 90 18 23 12
    */
    void outPutValue(LinkList L)
    {
        LNode *s=L->next;
        while(s!=NULL)
        {
            cout<<s->data<<" ";
            s=s->next;
        }
        cout<<endl;
    }
    
    //按序号查找单链表L(带头结点)中第i个位置结点指针
    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;
    }
    
    //按值查找表结点
    LNode *LocateElem(LinkList L,int e)
    {
        LNode *p=L->next;
        while(p!=NULL&&p->data!=e) p=p->next;
        return p;
    }
    
    //插入结点操作
    /*调用GetElem(L,i-1),查找第i-1个结点,再在其后插入新结点*/
    LinkList InsertNode(LinkList &L,int i)
    {
        LNode *p,*s;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=100;
        p=GetElem(L,i-1);
        s->next=p->next;
        p->next=s;
        return L;
    //    //将*s结点插入到*p结点之前的主要代码
    //    int temp=0;
    //    s->next=p->next;
    //    p->next=s;
    //    temp=p->data;
    //    p->data=s->data;
    //    s->data=temp;
    }
    
    //删除结点操作
    LinkList DeleteNode(LinkList &L,int i)
    {
        //结点*p为找到的被删除结点的前驱结点
        LNode *p,*q;
        p=GetElem(L,i-1);
        q=p->next;
        p->next=q->next;
        free(q);
        return L;
        //删除结点*p
        //法一:先找到*p的前驱结点,再执行删除操作,时间复杂度为O(n)
        //法二:将*p后继结点值赋予自身,再删除后继结点,时间复杂度为O(1)
    //    q=p->next;
    //    p->data=q->data;
    //    p->next=q->next;
    //    free(q);
    }
    
    int main()
    {
        int n;
        LinkList L;
        LNode *s,*t;
        cin>>n;
    //    List_HeadInsert(L,n);
        List_TailInsert(L,n);
        outPutValue(L);
    //    s=GetElem(L,3);
    //    cout<<s->data;
    //    t=LocateElem(L,2);
        InsertNode(L,3);
        outPutValue(L);
        DeleteNode(L,3);
        outPutValue(L);
        return 0;
    }
    /*
    5
    23 12 56 78 90
    23 12 56 78 90
    23 12 100 56 78 90
    23 12 56 78 90
    */

     

    天晴了,起飞吧
  • 相关阅读:
    Step one : 熟悉Unix/Linux Shell 常见命令行 (三)
    Step one : 熟悉Unix/Linux Shell 常见命令行 (一)
    PLAN: step one
    PLAN : 入门题目 ( update )
    SZU : A11 Sequence
    SZU:B85 Alec's Eggs
    codeforces 518B. Tanya and Postcard 解题报告
    BestCoder8 1001.Summary(hdu 4989) 解题报告
    hdu 1556.Color the ball 解题报告
    codeforces 515C. Drazil and Factorial 解题报告
  • 原文地址:https://www.cnblogs.com/jianqiao123/p/14375621.html
Copyright © 2020-2023  润新知