• 线性表----单链表


    一,实验内容:链表的创建、插入与删除操作

    二.程序清单

    三.思考

    l.如果需要将新结点 插入  到     第i个数据元素之后,算法将如何改动?

    2. 双向链表和循环链表的定义和构造方法。

    //链表的创建及插入、删除操作
    #include "stdio.h"
    #include"stdlib.h"
    
    #define NULL 0
    #define error  0
    #define ok 1
    #define overflow -2
    #define infeasible -1
    
    //类型定义
    typedef  int  Status;
    typedef  int  ElemType;
    
    //定义链表的存储结构
    typedef struct LNode
    {int data;        //数据域
     struct LNode *next;  //指针域
     }LNode,*LinkList;   //链表的类型
    
    Status GetElem_l(LinkList L, int i , ElemType &e)
    //L为带头结点的单链表,当第i 个元素存在时,其值赋给e.
    {int  j;
    LinkList  p ;
    p=L->next;  j=1;
    while(p&&j<i)  //顺序找第i个元素.
    {p=p->next;  ++j;}
    if(!p||j>i) return error;
    e=p->data;
    return ok;
    }
    
    //逆序创建链表
     void CreatList_L1(LinkList &L,int n) //n为元素个数,L为头结点
     {int i;
      LinkList p;
      L=(LinkList)malloc(sizeof(LNode)); //生成头结点
      L->next=NULL;
      for(i=n;i>0;i--)                //链头插入法
       { p=(LinkList)malloc(sizeof(LNode));
         scanf("%d",&p->data);
         p->next=L->next;
         L->next=p;
         }
       }
    
    //正序创建单链表
    void  CreatList_L2(LinkList &L,int n )   ///n为元素个数,L为头结点
    {int    i ;
     LinkList  p,q;
     L=(LinkList )malloc(sizeof(LNode));
    q=L;
    for(i=0;i<n;i++)  //链尾插入法
     { p=(LinkList )malloc(sizeof(LNode));
       scanf("%d",&p->data);
       q->next=p;
       q=p;
     }
    q->next=NULL;
    }
    
    //输出链表
    void print(LinkList L)
    {LinkList p;
     p=L->next;
     while(p)
     {printf("%d ",p->data);
      p=p->next;
      }
    }
    
    //链表的插入操作
    int ListInsert(LinkList &L,int i,int e)
    {LinkList p,s;
    int j;
     p=L;j=0;
     while(p&&j<i-1)
     {p=p->next; ++j;}
     if(!p||j>i-1) return error;
     s=(LinkList)malloc(sizeof(LNode));
     s->data=e; s->next=p->next;
     p->next=s;
     return ok;
     }
    
    //链表的删除操作
     int ListDelete(LinkList &L,int i,int &e)
     {LinkList p,q;
      int j;
      p=L; j=0;
      while(p->next&&j<i-1)
       { p=p->next; ++j;}
      if(!(p->next)||j>i-1) return error;
      q=p->next;p->next=q->next;
      e=q->data;free(q);
      return ok;
      }
    
    //对链表的元素进行排序
    Status  sortlinklist(LinkList &L)
    {LinkList p,q,r;
     ElemType t;
    p=L->next; //p指向链表第一个元素结点
    while(p->next!=NULL)
     {q=L->next; //q指向链表第一个元素结点
      while(q->next!=NULL)
       {r=q->next;
        if(q->data>r->data) //相邻两个元素比较、交换
         {t=q->data; q->data=r->data; r->data=t; }
        q=q->next;
       }
      p=p->next;
     }
    
    return ok ;
    }
    
    void mergelist_l(LinkList  la, LinkList &lb, LinkList &lc)
    {LinkList pa,pb,pc;
     pa=la->next;   pb=lb->next ;
     lc=pc=la;
    while(pa&&pb)
     if(pa->data <=pb->data)
      {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 main()
    {LinkList L1,L2,L3;
     int n,ins,del,i;
    //创建一个先进先出单链表
     printf("please input FIFo linklist's  node number  n:
    ");
     scanf("%d",&n);
                            
     printf("please input the linklist %d nodes data 
    ",n);
     CreatList_L2(L2,n);
     print(L2);
     printf("
    ");
    //创建一个后进先出单链表
    printf("please input  LIFO linklist's  node number  n:
    ");
     scanf("%d",&n);
     printf("please input the linklist %d nodes data 
    ",n);
     CreatList_L1(L1,n);
     print(L1);
     printf("
    ");
    //对链表进行插入操作
     printf("please input the insert node's locate  i and  value e
    ");
     scanf("%d%d",&i,&ins);
     ListInsert(L1,i,ins);
     print(L1);
     printf("
    ");
     
    //对链表进行删除操作
     printf("please input the delete node's locate  i
    ");
     scanf("%d",&i);
     ListDelete(L1,i,del);
     print(L1);
     printf("
    %d
    ",del);
    //对链表进行排序
    sortlinklist(L1);
    printf("
     the L1 list's sort is:
    ");
    print(L1);
    printf("
     the L2 list's sort is:
    ");
    sortlinklist(L2);
    print(L2);
    //对链表进行合并
    printf("
     the merge result is : 
    " );
    mergelist_l(L1,L2,L3);
    print(L3);
     }
  • 相关阅读:
    【转载】常见的Web攻击手段之XSS攻击讲解及实战
    【转载】常见的Web攻击手段之CSRF攻击
    【转载】Ognl表达式基本原理和使用方法(最全最详细附带源码解读)
    linux(centos7)安装jdk8--附带oracle账号
    Vagrant+Secure CRT的使用
    Idea 如何解决项目依赖冲突
    全局唯一iD的生成 雪花算法详解及其他用法
    【转载】什么是java OOM?如何分析及解决oom问题?
    FastJSON的0day漏洞报告
    MySQL/Oracle 添加/查看表注释和字段注释
  • 原文地址:https://www.cnblogs.com/java2016/p/7636126.html
Copyright © 2020-2023  润新知