线性表链式实现 纯手工原创

#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
*/
原文地址:https://www.cnblogs.com/13224ACMer/p/5031641.html