• 线性表综合运用


    问题描述:三个递增有序线性表A,B,C. A有这样操作:删除既在B中又在C中出现的元素,分别对顺序表和单链表编写实现上述操作的算法,并分析时间复杂度。

    问题分析:此题的关键是对三个表中的元素进行比较,当A中有既在B中又在C中的元素时删除此元素。要这样比较,想到需要三个if嵌套,试着分析一下

    我的分析貌似有道理,用三个嵌套,答案是结合上面的题,做了个综合运用,莫非这就是综合概况能力呢?真的很奇妙呀。

    用顺序表实现的代码如下:

     

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #define LIST_INIT_SIZE 100
      4 #define LISTINCREMENT 10
      5 typedef struct{
      6 int *elem;//基址
      7 int length;//表的长度
      8 int listsize;//表的当前长度
      9 }SqList;//结构体类型
     10 void InitList_Sq(SqList &L)
     11 {
     12     L.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
     13     if(!L.elem)
     14         exit(0);
     15     L.length=0;
     16     L.listsize=LIST_INIT_SIZE;
     17 }
     18 void ListInsert_Sq(SqList &L,int i,int e)
     19 {
     20     //在顺序线性表L中第i个位置之前插入新的元素e
     21     //i的合法值为1-L.length+1
     22     if(i<1||i>L.length+1)
     23     {
     24         printf("插入的位置有误!");
     25         exit(0);
     26     }
     27     if(L.length>=L.listsize)
     28     {
     29         int *newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
     30         if(!newbase)
     31             exit(0);
     32         L.elem=newbase;
     33         L.listsize+=LISTINCREMENT;
     34     }
     35     int *q=&(L.elem[i-1]);
     36     *q=e;
     37     L.length++;
     38 }
     39 void ListCross_LRS(SqList &B,SqList &C)
     40 {
     41     int i=0,j=0,k=0;
     42     while(i<B.length&&j<C.length)
     43     {
     44         if(B.elem[i]<C.elem[j])
     45             i++;
     46         else
     47         {
     48             if(B.elem[i]>C.elem[j])
     49                 j++;
     50             else
     51             {
     52                 if(k==0)
     53                 {
     54                     B.elem[k]=B.elem[i];
     55                     k++;
     56                 }
     57                 else//消除元素相同的
     58                     if(B.elem[k-1]!=B.elem[i])
     59                     {
     60                         B.elem[k]=B.elem[i];
     61                         k++;
     62                     }
     63                 i++;
     64                 j++;
     65             }
     66         }//end else
     67     }//end while
     68     B.length=k;
     69 }
     70 void ListCrossDelSame_L(SqList &A,SqList &B)
     71 {
     72   int i=0,j=0,k=0;
     73   while(i<A.length&&j<B.length)
     74   {
     75       if(A.elem[i]<B.elem[j])
     76       {
     77           A.elem[k++]=A.elem[i];
     78           i++;
     79       }
     80       else
     81       {
     82           if(A.elem[i]>B.elem[j])
     83               j++;
     84           else
     85               i++;
     86       }
     87   }
     88   while(i<A.length)
     89   {
     90       A.elem[k++]=A.elem[i];
     91       i++;
     92   }
     93   A.length=k;
     94 }
     95 void  ListCross_Sq(SqList &A,SqList &B,SqList &C)
     96 {
     97     ListCross_LRS(B,C);
     98     ListCrossDelSame_L(A,B);
     99 }
    100 
    101 int main()
    102 {//代码还是要规范点好,现在处于打基础阶段。。。。
    103     SqList A,B,C;
    104     int len_A,len_B,len_C,temp,i;
    105     InitList_Sq(A);
    106     printf("输入A表的长度:\n");
    107     scanf("%d",&len_A);
    108     printf("将对应值值插入A表中:\n");
    109     for(i=1;i<=len_A;i++)
    110     {
    111       scanf("%d",&temp);
    112       ListInsert_Sq(A,i,temp);
    113     }
    114 
    115     InitList_Sq(B);
    116     printf("输入B表的长度:\n");
    117     scanf("%d",&len_B);
    118     printf("将对应值值插入B表中:\n");
    119     for(i=1;i<=len_B;i++)
    120     {
    121       scanf("%d",&temp);
    122       ListInsert_Sq(B,i,temp);
    123     }
    124 
    125     InitList_Sq(C);
    126     printf("输入C表的长度:\n");
    127     scanf("%d",&len_C);
    128     printf("将对应值值插入C表中:\n");
    129     for(i=1;i<=len_C;i++)
    130     {
    131       scanf("%d",&temp);
    132       ListInsert_Sq(C,i,temp);
    133     }
    134 
    135     ListCross_Sq(A,B,C);
    136     printf("对A表进行操作,删除既在B又在C中的元素后的值为:\n");
    137     for(i=0;i<A.length;i++)
    138         printf("%d",A.elem[i]);
    139 }
    View Code

     

     

    接下来用单链表实现

     

     

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 typedef struct LNode{
      4 int data;
      5 struct LNode *next;
      6 }LNode,*LinkList;//结构体类型,结构体名
      7 struct LNode* CreateLinkList(LinkList head)
      8 {
      9     int t;
     10     LNode *p;
     11     head=(LNode *)malloc(sizeof(LNode));
     12     head->next=NULL;
     13     printf("创建链表中的数据,以0为结束符标志\n");
     14     while(scanf("%d",&t)&&t!=0)
     15     {
     16         p=head;//在建好的单链表中,以p为扫指针,从头开始查找有无数据重复
     17         while((p->next)&&(t!=p->next->data))
     18             p=p->next;
     19         if(p->next)
     20             printf("已经存在此数:%d,请重输!",t);
     21         else
     22         {
     23             p->next=(LNode *)malloc(sizeof(LNode));
     24             //在单链表表尾申请一个新结点
     25             p=p->next;
     26             p->data=t;
     27             p->next=NULL;
     28         }
     29     }
     30     return head;
     31 }
     32 LinkList ListCross_LRS(LinkList B,LinkList C)
     33 {
     34     int k=0;
     35     LinkList pb,qb,pc,qc,pt;
     36     pb=B;
     37     qb=pb;
     38     pb=pb->next;
     39     pc=C;
     40     //qc=pc;
     41     pc=pc->next;
     42     while(pb&&pc)
     43     {
     44         //if(B.elem[i]<C.elem[j])
     45         //    i++;
     46         if(pb->data<pc->data)
     47         {
     48             pt=pb;
     49             pb=pb->next;
     50             qb->next=pb;
     51             free(pt);
     52         }
     53         else
     54         {
     55         //    if(B.elem[i]>C.elem[j])
     56         //        j++;
     57             if(pb->data>pc->data)
     58                 pc=pc->next;
     59             else
     60             {
     61                 if(k==0)
     62                 {
     63                     //B.elem[k]=B.elem[i];
     64                     //k++;
     65                     qb=pb;
     66                     pb=pb->next;
     67                     k++;
     68                 }
     69                 else//消除元素相同的
     70                 {
     71                     if(qb->data!=pb->data)
     72                     {
     73                         //B.elem[k]=B.elem[i];
     74                         qb=pb;
     75                         pb=pb->next;
     76                         k++;
     77                     }
     78                     else
     79                     {
     80                       pt=pb;
     81                       pb=pb->next;
     82                       qb->next=pb;
     83                       free(pt);
     84                     }
     85                 }//end else1
     86             }//end else2
     87         }//end else3
     88     }//end while
     89     return B;
     90 }
     91 void ListCrossDelSame_L(LinkList A,LinkList B)
     92 {
     93       int k=0;
     94     LinkList pa,qa,pb,qb,pt;
     95     pa=A;
     96     qa=pa;
     97     pa=pa->next;
     98     pb=B;
     99     //qc=pc;
    100     pb=pb->next;
    101   while(pa&&pb)
    102   {
    103       if(pa->data<pb->data)
    104       {
    105           //A.elem[k++]=A.elem[i];
    106          // i++;
    107           qa=pa;
    108           pa=pa->next;
    109       }
    110       else
    111       {
    112           //if(A.elem[i]>B.elem[j])
    113          //      j++;
    114           if(pa->data>pb->data)
    115               pb=pb->next;
    116           else
    117           {
    118               pt=pa;
    119               pa=pa->next;
    120               qa->next=pa;
    121               free(pt);
    122           }
    123               
    124       }
    125   }
    126   while(pa)
    127   {
    128      qa=pa;
    129      pa=pa->next;
    130   }
    131  /* LNode *p1;
    132     p1=A->next;
    133     while(p1)
    134     {
    135       printf("%d",p1->data);
    136       p1=p1->next;
    137     }*/
    138 //  return A;
    139 }
    140 void ListCross_Sq(LinkList A,LinkList B,LinkList C)
    141 {
    142     B=ListCross_LRS(B,C);
    143     ListCrossDelSame_L(A,B);
    144     //return A;
    145 }
    146 
    147 int main()
    148 {//代码还是要规范点好,现在处于打基础阶段。。。。
    149     LinkList A,B,C;
    150     printf("创建A链表:\n");
    151     A=CreateLinkList(A);
    152 
    153     printf("创建B链表:\n");
    154     B=CreateLinkList(B);
    155 
    156     printf("创建C链表:\n");
    157     C=CreateLinkList(C);
    158 
    159     ListCross_Sq(A,B,C);
    160     printf("对A链表进行操作,删除既在B又在C中的元素后的值为:\n");
    161     LNode *p1;
    162     p1=A->next;
    163     while(p1)
    164     {
    165       printf("%d",p1->data);
    166       p1=p1->next;
    167     }
    168 }
    View Code

     

     总结:修改了以后,看着自己的博客好多了,自己写的东西先要被自己接受,呵呵,好好努力,做到慢慢让自己满意。

  • 相关阅读:
    PHP中simpleXML递归实现XML文件与数组的相互转化(原创)
    关于本地服务器localhost请求Forbidden解决办法
    PHP中XPATH 实现xml及html文件快速解析(附xml做小型数据库实现六级单词快速查询实例)
    win8忘记开机密码解决方法汇总
    HTML5的FileAPI实现文件的读取及超大文件的上传
    FormData实现form表单的数据打包
    Ajax_iframe文件上传
    深入浅出JSONP--解决ajax跨域问题
    2017ACM暑期多校联合训练
    2017ACM暑期多校联合训练
  • 原文地址:https://www.cnblogs.com/wj204/p/3044197.html
Copyright © 2020-2023  润新知