• 单链表


    链表中的每个结点只有一个指针域,我们将这种链表称为单链表。 
    头指针(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;
    }
  • 相关阅读:
    AtCoder Grand Contest 029C
    AtCoder Grand Contest 034D
    JZOJ 4418. 【HNOI2016模拟4.1】Prime的把妹计划(单调栈+线段树)
    COCI 2015/2016 PROKLETNIK(单调栈+线段树)
    常用数论定理(费马小定理&欧拉定理&扩展欧拉定理)
    JZOJ 3252. 【GDOI三校联考】炸弹(树形DP)
    prufer序列入门
    NOI2020全国统一省选-GDOI游记(爆炸记)
    Manacher算法操作详解
    JZOJ 6493. 【GDOI2020模拟03.04】迷宫(状压DP)
  • 原文地址:https://www.cnblogs.com/lxzw/p/12890827.html
Copyright © 2020-2023  润新知