zoukankan      html  css  js  c++  java
  • 线性表链式实现 纯手工原创

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    #define LIST_INIT_SIZE 100
    #define LISTINCREMENT 10
    #define status int
    #define elemtype int
    typedef struct lnode{
       elemtype date;
       struct lnode *next;
    }node,*linklist;
    void init(linklist &l){
       linklist p=(linklist)malloc(sizeof(lnode));
       p->next=NULL;
       l=p;
    }
    status get_elem(linklist l,int i,elemtype &e){
       ////L为带头结点的单链表的头指针, 当第i个元素存在时, 其值赋给e并返回OK, 否则返回ERROR
        struct lnode *p=NULL;
        p=l->next;
        elemtype j=1;
        while(p&&j<i){//若j<n,在while循环结束后j==i,指针p指向第i个节点
           p=p->next;
           j++;
        }
        if(!p||j>i)
        return ERROR;
        e=p->date;
        return OK;
    }
    //插入和删除都是需要先便利值第i个位置的前一个节点
    status listinsert(linklist &l,int i,elemtype &e){// 在第i个位置插入元素e,其实就是在第i个元素之前插入
      linklist p=l;
      linklist s=NULL;
       elemtype j=0;
        while(p&&j<i-1){
           p=p->next;
           j++;
        }
       if(!p||j>i-1)
       return ERROR;
       s=(linklist)malloc(sizeof(lnode));
       s->date=e;
       s->next=p->next;
       p->next=s;
       return OK;
    }
    status listdelete(linklist &l,int i,elemtype &e){//删除第i个元素
       linklist p=l;
        linklist q=NULL;
        elemtype j=0;
        while(p->next&&j<i-1){//注意此处的p->next,因为我们删除的下个节点必须不为NULL;
           p=p->next;
           j++;
        }
        if(!p->next||j>i-1)
          return ERROR;
          q=p->next;
    
          p->next=q->next;
           e=q->date;
          free(q);
          return OK;
    }
    
    void creatlist(linklist &l,int n){//倒序插入值建立链表  page:30
        struct lnode *p=NULL;
         l=(linklist)malloc(sizeof(lnode));
         l->next=NULL;
         for(int i=n;i>0;i--){
              p=(linklist)malloc(sizeof(lnode));
              scanf("%d",&p->date);
              p->next=l->next;
              l->next=p;
         }
    }
    
    void mergelist(linklist &la,linklist &lb,linklist &lc){
          //已知单链线性表La和Lb的元素按值非递减排列
          //归并La和Lb得到新的单链线性表Lc, Lc的元素也按值非递减排列
          struct lnode *pa = NULL;
           struct lnode *pb = NULL;
            struct lnode *pc = NULL;
           pa=la->next;
           pb=lb->next;
           pc=lc=la;
           while(pa&&pb){
              if(pa->date<=pb->date){
                  pc->next=pa;
                  pc=pa;
                  pa=pa->next;
              }
              else{
                pc->next=pb;
                  pc=pb;
                  pb=pb->next;
              }
           }
           pc->next=pa?pa:pb;
           free(lb);
    }
    int get_pos(linklist &l,elemtype e,int n){//查找是否有元素e,有返回位序,没有返回0
        linklist q=l;
        q=q->next;
        int j=1;
        while(j<=n){
            if(q->date==e)
                break;
            j++;
            q=q->next;
        }
        if(j<=n)
            return j;
        return 0;
    }
    void Union(linklist &l1,linklist l2,elemtype &cnt){
         //输入两个链表并分别构造,将l2中不含l1的元素插入到l1链表的尾部
        //此调用函数的主函数是最后一个主函数
           linklist p1=l1;
                 linklist p11=l1;
           p1=p1->next;
           linklist p2=l2;
           p2=p2->next;
           while(p1){
                p11=p1;
              p1=p1->next;
              cnt++;
           }
    
           int len1=cnt;
           while(p2){
                int tmp=p2->date;
                int flag=get_pos(l1,tmp,len1);
                if(!flag){
                    linklist s=(linklist)malloc(sizeof(lnode));
                    s->date=tmp;
                    s->next=NULL;
                    p11->next=s;
                    p11=s;
                    cnt++;
                }
                  p2=p2->next;
           }
    
    }
    
    int main(){
          linklist l;
       //  creatlist(l,0);//倒叙插入的时候,而且明确了元素的个数的时候使用,第二个参数传的值为元素的个数
          init(l);//,没有明确个数,直接初始化的时候用
          //上述两种初始化根据题意要求选择适合的
          linklist p=l;
          int  e,cnt=0;;
          while(~scanf("%d",&e)){
                cnt++;
            listinsert(l,cnt,e);
          }
    
        printf("%d
    ",cnt);//输出元素的个数
        // 逆序输出,i++的时候正序输出
        for(int i=cnt;i>0;i--){
            listdelete(l,i,e);
            printf("%d",e);
        }
        /*正序输出 ,和上面一样的,选一种即可
       int x;
        scanf("%d",&x);
        
        p=p->next;
        while(p){
                if(p->date>=x)//如果需要输出只比x大的数加上此行,如果需要输出只比x小的数把符号改变即可,
            printf("%d
    ",p->date);
            p=p->next;
        }*/
        
        //输出链表中第pos个数
        int pos;
        scanf("%d",&pos);
        get_elem(l,pos,e);
        printf("%d
    ",e);
             
        //查找线性表中是否有元素e,如果有,返回他的位序,否则返回0
        scanf("%d",&e);
        int ans;
       ans= get_pos(l,e,cnt);
        printf("%d
    ",ans);
        return 0;
    }
    int main(){
        //输入两个链表l1,l2,将l1,l2按照非递减顺序排列存到l3中
        // 此主函数针对调用 mergelist()函数
          linklist l1,l2,l3;
          init(l1);
          init(l2);
          init(l3);
          int  e,cnt=0;
          elemtype n1,n2,i;
            scanf("%d",&n1);//输入第一个链表的个数
            for( i=1;i<=n1;i++){
                    cnt++;
                 scanf("%d",&e);
                listinsert(l1,i,e);
            }
            scanf("%d",&n2);//输入第二个链表的个数
             for( i=1;i<=n2;i++){
                    cnt++;
                 scanf("%d",&e);
                listinsert(l2,i,e);
            }
            printf("%d
    ",cnt);//输出合并后的序列的个数
            mergelist(l1,l2,l3);
            linklist p=l3;
            p=p->next;
            while(p){//按照顺序输出合并后的元素
            printf("%d
    ",p->date);
            p=p->next;
           }
    
        return 0;
    }
    int main(){
        //输入两个链表并分别构造,将l2中不含l1的元素插入到l1链表的尾部
         linklist l1,l2;
          init(l1);
          init(l2);
          elemtype n1,n2,i,e,cnt=0;
            scanf("%d",&n1);//输入第一个链表的个数
            for( i=1;i<=n1;i++){
                 scanf("%d",&e);
                listinsert(l1,i,e);
            }
            scanf("%d",&n2);//输入第二个链表的个数
             for( i=1;i<=n2;i++){
                 scanf("%d",&e);
                listinsert(l2,i,e);
            }
            Union(l1,l2,cnt);
            printf("%d
    ",cnt);//输出合并后的序列的个数
            linklist p=l1;
            p=p->next;
           while(p){
            printf("%d  ",p->date);
            p=p->next;
        }
    
        return 0;
    }
    /*样例
    4
    3 5 8 11
    7
    2 6 8 9 11 15 20
    */
  • 相关阅读:
    限时购校验小工具&dubbo异步调用实现限
    Android 应用防止被二次打包指南
    什么是高防服务器?
    真屏实据丨数据大屏设计实战—揭秘企业级数据大屏设计过程
    TerminateThread函数学习
    HTML DOM访问
    gdb常用命令
    整数开方算法
    android环境下解决java.io.IOException: Malformed ipv6异常的方法
    HTML DOM 创建与修改
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/5031641.html
Copyright © 2011-2022 走看看