线性表综合运用

问题描述:三个递增有序线性表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

 

 

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

posted @ 2013-04-26 10:16  wj704  阅读(186)  评论(0编辑  收藏  举报