zoukankan      html  css  js  c++  java
  • *单链表[带头结点]

    基本结构:

    typedef struct node
    {
        int data;
        struct node *next;
    }*List,Node;

    创建

    第一种:先初始化,再创建链表。在初始中,让头结点的next为NULL;

    void Init(List &L)
    {
        L=(List)malloc(sizeof(Node));
        if(!L)
            exit(-1);
        L->next=NULL;
    }

    第二种:不初始化,直接创建,又分为以下几种。
    <1>尾插法,假如创建n个结点。(从前往后建立结点,推荐!

    void creat(List &L,int n) /*尾插法*/
    {
        int e,i;
        List p,s;
        L=(List)malloc(sizeof(Node));
        p=L;
        for(i=0;i<n;i++)
        {
            s=(List)malloc(sizeof(Node));
            cin>>e;
            s->data=e;
            
            p->next=s;
            p=s;
        }
        p->next=NULL; /*尾部指向空*/
    }

    <2>头插法:不需要额外的指针、

    void creat(List &L,int n)/*头插法*/
    {
        int e,i;
        List s;
        L=(List)malloc(sizeof(Node));
        L->next=NULL;
        for(i=0;i<n;i++)
        {
            s=(List)malloc(sizeof(Node));
            cin>>e;
            s->data=e;
            
            s->next=L->next;
            L->next=s;
        }
    }

    插入和删除
    插入:在第i个位置处插入数据,游标p移到第i-1个位置(也即待删元素左边),这个位置是关键!

    int Insert(List &L,int i,int e) /*插入操作*/
    /* 1<=i<=L->Length */
    {
        int j=1;
        List p,s;
        p=L;/*指向第一个结点*/
        while(p && j<i) /*移到i-1的位置处*/
            {
                p=p->next;
                ++j;
            }
        if(!p || j>i) /*防止输入0或者大于结点的长度*/
            return ERROR;
            
        s=(List)malloc(sizeof(Node));
        s->data=e;
        
        s->next=p->next;
        p->next=s;
        return OK;
    }

    删除:借助两个游标p,q,移动之后,q指向第i-1个位置(也就是待删元素左边的位置),p指向待删元素,(这两个位置很重要!)

    int Delete(List &L,int i,int &e)
    /* 1<=i<=L->Length */
    {
        int j=1;
        List p,q;
        q=L;
        while(q->next && j<i)/*防止删除长度越界*/
        {
            q=q->next;
            ++j;
        }
        if(!(q->next) || j>i)
            return ERROR;
        
        p=q->next;
        e=p->data;
        
        q->next=p->next;
        free(p);
        return OK;
    }

    遍历

    void Traverse(List &L)
    {
        List p=L->next;
        while(p)
        {
            cout<<p->data;
            p=p->next;
        }
    }

    销毁

    依然是位置,q指向待销毁元素,p指向待销毁元素的下一个元素,即(p总提前于q)!

    int Delete(List &L)
    {
        List p,q;
        q=L->next;
        while(q)
        {
            p=q->next;
            free(q);
            q=p;
        }
        L->next=NULL;
        return OK;
    }
  • 相关阅读:
    每一个合格的家庭主妇都是生产厂长的有力竞争者
    单点登录在ASP.NET上的简单实现
    Asp.net(C#)给图片加上水印效果
    Asp.net Ajax框架教程
    记入cookie一个ip一天只弹一次的弹窗代码JavaScript实例教程
    【转】ASP.net2。0中解决无法获取 GridView 隐藏列值问题
    javascript 动态添加表格行
    IndexOf方法,LastIndexOf方法,substring方法
    SQL 批量插入数据
    js 前台找控件(table里找控件)
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5280920.html
Copyright © 2011-2022 走看看