【思路】/*首先应该判空,空则显示出错,并推出;再遍历整个顺序表,找最小值,并记录位置,遍历完成后用最后一个元素补到原来这个最小值元素的位置上。*/
bool Del_min(SqList &L,ElemType &value){ //value 返回值
if(L.length==0) return false;
value = L.data[0];
int index = 0;
for(int i =1;i
/*题目要求空间复杂度为O(1),也就是辅助空间为常数级,那数组是不行的了,所以考虑temp变量暂时存放,然后前半和后半对应位置对调即可*/
/*例如1,2,3,4,5 需要逆置,那将前半段和后半段对应位置对调——1,5;2,4;3,就可以得到54321*/
void Reverse(SqList &L){
ElemType temp;
for(int i = 0 ; i
/*【思路】设cnt=0,每次循环如果有x就cnt++,没有则,让当前元素往前移动cnt个位置。*/
void Del_X(SqList &L,ElemType x){
int cnt = 0;i = 0;
while(i
/*【思路】先判空,空则返回false;未异常则遍历顺序表,然后如果遍历时元素大小在s,t之间,那么cnt++。用以表示要删除的个数,方便后边的不在s,t之间的元素前移覆盖,从而达到删除的效果*/
bool Del_s_t(SqList &L,ElemType s,ElemType t){
int i,cnt=0;
if(L.length==0||s>=t){ //判空,不能s>=t
return false;
}
for(i = 0;i=s&&L.data[i]<=t){
cnt++;
}else{
L.data[i-cnt]=L.data[i]; //前移k个位置
}
}
L.length-=cnt;
return true;
}
/*【思路】有序顺序表,重复的元素一定是在相邻的位置。所以记录第一个元素后,然后依次判断后面的元素是否与前面非重复的有序表的最后一个元素相同。若相同,继续往后走;不相同就插入到非重复有序表的最后。*/
bool Del_Same(SqList &L){
if(L.length==0){
return false;
}
int i ,j //i表示第一个不相同的元素,j当作指针遍历后面的元素
for(i = 0,j=1; j
/*超级经典!!!【思路】将两个有序顺序表,每次都比较,然后存放较小的那个值。这两个顺序表总有一个先达到length,然后将剩下那个直接搬到总表中*/
bool Merge(SqList A,SqList B,SqList &C){
if(A.length+B.length>C.maxSize){
return false;
}
int i,j,k=0;
while(i
/*带头节点*/
bool InitList(LinkList &L){
L = (LNode*)malloc(sizeof(LNode));//创建头节点
L->next = NULL;
return true;
}
/*不带头节点*/
bool InitList(LinkList &L){
L = NULL;
return true;
}
/*记录单链表表中数据结点的个数*/
//带头结点
int Length(LinkList L){
int len = 0 ;
LNode *p=L;
while(p->next!=NULL){
p = p->next;
len++;
}
return len;
}
//不带头结点
int Length(LinkList L){
int len =0;
LNode *p =L ;
while(p!=NULL){
len++;
p = p->next;
}
return len;
}
/*沿着next域找,O(n)*/
LNode *GetElem(LinkList L,int i){
LNode *p=L;
int j = 0;
while(p!=NULL&&j
/*要用结点的data域和定值e比较。O(n)*/
//带头结点
LNode *LocateElem(LinkList L,ElemType e){
LNode *p =L->next;
while(p!=NULL&&p->data!=e){
p = p->next;
}
return p;
}
/*插入到第i个位置,就需要在第i-1个后面进行插入*/
/*s->next = p->next; p-next = s*/
bool ListInsert(LinkList &L,int i ,ElemType e){
LNode *p = L;
int j = 0;
while(p!=NULL&&jnext;
j++;
}
if(p==NULL) return false;
LNode *s = (LNode*)malloc(sizeof(LNode));//新插入结点建立
s->data = e;
s->next = p->next;
p->next =s;
return true;
}
/*还可以用交换数据域,将前插变为后插*/
s->next = p->next;
p->next = s;
tmp = p->data;
p->data = s->data;
s->data = tmp;
/*删除要记得释放空间*/
/*p是被删结点的前驱,q是被删的结点*/
bool ListDelete(LinkList &L,int i,ElemType &e){
LNode *p = L;
int j = 0;
while(p->next!=NULL&&jnext;
j++;
}
if(p->next ==NULL||j>i-1){
return false;
}
LNode *q = p->next;
e = q->data;
p->next = q->next;
free(q);
return true;
}
/*读入数据的顺序和生成的链表中元素的顺序是相反的,每个结点插入为O(1),设单链表长为n,则总时间复杂度为O(n)*/
LinkList List_HeadInsert(LinkList &L){
LNode *s;
int x;
L = (LNode*)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&x);
while(x!=11408){
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
LinkList List_TailInsert(LinkList &L){
int x;
L = (LNode*)malloc(sizeof(LNode));
LNode *s ,*r = L;
scanf("%d",&x);
while(x!=11408){
s = (LNode*)malloc(sizeof(LNode));
s->data =x;
r->next =s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}