问题描述:三个递增有序线性表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 }
接下来用单链表实现
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 }
总结:修改了以后,看着自己的博客好多了,自己写的东西先要被自己接受,呵呵,好好努力,做到慢慢让自己满意。