• 单链表


    链表中的每个结点只有一个指针域,我们将这种链表称为单链表。 
    头指针(head):指向链表第一个结点。
    最后一个结点指针域为空。
    结点可以连续存储,也可以不连续存储.
    结点的逻辑顺序与物理顺序可以不一致.
     
    //单链表的存储结构描述
    typedef struct Node // 结点类型定义
    {
        //ElemType 具体类型据实际设定, 如int,char等
        ElemType data;
        struct Node * next; 
    }Node, *LinkList;//LinkList为结构指针类型
     
    //初始化单链表
    InitList(LinkList *L)
    {
        *L = (LinkList)malloc(sizeof(Node));
        (*L)->next=NULL;
    }
     
    //头插法
    void CreateFromHead(LinkList L)
    {
        Node *s;
        int flag=1;//标志--初值为1,当输入‘$’时,flag为0,建表结束
        while(flag)
           { c=getchar();//接收一字符
             if(c!=’$’) //如果字符不是‘$’,则执行头插
                {
                    s=(Node *)malloc(sizeof(Node));
                    s->data=c;
                    s->next=L->next;
                    L->next=s;
                }
            else
               flag=0;
         } 
    }
     
    //尾插法
    void CreateFromTail(LinkList L)
    {
          Node *r, *s;
          int flag=1;//标志--初值为1,当输入“$”时,flag为0,建表结束
          r=L;
          while(flag)
             { c=getchar();//接收一字符
               if(c!=’$’) //如果字符不是’$’,则执行尾插
                   {
                      s=(Node *)malloc(sizeof(Node));
                      s->data=c;
                      r->next=s;
                      r=s;
                   }
             else
                {
                     flag=0;
                     r->next=NULL;
                 }
             } 
    }
     
    //单链表插入操作
    void InsList(LinkList L,int i,ElemType e)/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。 */
          Node *pre,*s;
          int k;
          if(i<1) return Error;
             pre=L; k=0;
         while(pre!=NULL&&k<i-1)
               { pre=pre->next; k=k+1; }
          if(!pre)
              { printf(“插入位置不合理!”); return Error; }
          s=(Node*)malloc(sizeof(Node)); //为e申请一个新的结点
          s->data=e; /*将待插入结点的值e赋给s的数据域*/
          s->next=pre->next;
          pre->next=s;
         return OK;
    }
     
    //单链表删除
    void DelList(LinkList L,int i,ElemType *e)
    {
         Node *pre,*r;
         int k;
         pre=L; k =0;
         while(pre->next!=NULL&&k<i-1)
            { pre=pre->next; k=k+1; }
        if( !(pre->next) )
            {
                 printf(“删除结点的位置i不合理!”);
                return ERROR;
             }
        r=pre->next;
        pre->next=pre->next->next /*删除结点r*/
        e = r->data;
        free(r); return OK;
    }
     
    //按序号查找
    Node * Get(LinkList L, int i)/*在带头结点的单链表L中第i个结点之前插入值为e的新结点。 */
    {
         int j;
         Node *p;
         if(i<=0)
         return NULL;
         p=L;j=0; / * 从头结点开始扫描 * /
         while ( (p->next!=NULL)&&(j<i) )
            { p=p->next;
              j++;
            }
         if(i= =j)return p; / * 找到了第i个结点 * /
         else return NULL; / * 找不到,i>n * /
    }
     
    //按值查找
    Node *Locate( LinkList L,ElemType key)/ * 在带头结点的单链表L中查找其结点值等于key的结点,若找到则返回该结点的位置p,否则返回NULL * /
    {    Node *p;
         p=L->next; / * 从表中第一个结点比较 * /
         while (p!=NULL)
         if (p->data!=key)
            p=p->next;
         else
              break; / * 找到结点key,退出循环 * /
         return p;
    }
     
    //单链表的长度
    int ListLength(LinkList L) /*L为带头结点的单链表*/
    {
        Node *p;
        p=L->next;
        j=0; /*用来存放单链表的长度*/
        while(p!=NULL)
          { p=p->next;
            j ++;
          }
        return j;
    }
  • 相关阅读:
    Roce ofed 环境搭建与测试
    Ubuntu 1804 搭建NFS服务器
    Redhat 8.0.0 安装与网络配置
    Centos 8.1 安装与网络配置
    SUSE 15.1 系统安装
    VSpare ESXi 7.0 基本使用(模板、iso、SRIOV)
    VSpare ESXi 7.0 服务器安装
    open SUSE leap 15.1 安装图解
    KVM虚拟机网卡连接网桥
    GitHub Action一键部署配置,值得拥有
  • 原文地址:https://www.cnblogs.com/lxzw/p/12890827.html
Copyright © 2020-2023  润新知