重温数据结构,当时没有怎么做题,现在回顾下,为以后成为职业人打好基础。
//链表分解算法
void Analyze(Hlist list){
Hlist b,c,q,pc;
b->next=NULL;
c->next=NULL;
pc=list->next;
while( pc!= NULL){
q=pc->next;
if(pc->data<0){
pc->next=b->next;
b->next=pc;
}else if(pc->data>0){
pc->next=c->next;
c->next=pc;
}
pc=q;
}
}
//删除最大最小之间的值 ,复杂度O(n)
void DelMinBetweenMax(Hlist list,int min,int max){
Hlist t,q,p;
p=list->next;
if(list->next==NULL) return ;
while(p!=NULL){
if(p->data<=min){
t=p;
p=p->next;
}
if(p->data>min) break;
}
//当前的pc是要删除的
while(p){
while(p->data>min&&p->data<max){
q=p->next;
free(p);
p=q;
}
if(p->data<=min||p->data>=max){
t->next=p;
t=p;
p=p->next;
}
}
show(list);
return ;
}
//合并有序表
void MergeList(Hlist list1,Hlist list2,Hlist chead){
Hlist a,b,pc,q;
a=list1->next;
b=list2->next;
chead->next=NULL;
pc=chead;
while(a!=NULL&&b!=NULL){
if(b->data<a->data){
pc->next=b;
pc=b;
b=b->next;
}else if(a->data<b->data){
pc->next=a;
pc=a;
a=a->next;
}else if(a->data=b->data){
pc->next=a;
pc=a;
a=a->next;
q=b->next;
free(b);
b=q;
}
}
pc->next=a? a:b;//剩下的谁不为空则就可以插入
free(list1);
}
// 制作逆序链表
void InvertList(Hlist list){
Hlist C_head;
Hlist q,pc=list->next;
C_head->next=NULL;
while(pc){
q=pc->next;
pc->next=C_head->next;
C_head->next=pc;
pc=q;
}
show(C_head);
}
//得出最大节点值
int MaxNode(Hlist list){
int Max;
Hlist p=list;
if(list->next==NULL) return NULL;
Max=p->next->data;
while(p->next!=NULL){
p=p->next;
if(Max<(p->data))
Max=p->data;
}
return Max;
}
//一次性删除链表内所有数据为指定的值,时间复杂度O(n),空间复杂度为O(n).
List DelPointVua(List list,int vua){
int i,j;
List p;
i=0;j=-1;
p.a=(int *)malloc(sizeof(int)*(list.len+1));
if(p.a==NULL) exit(-1);
while(i<=list.len){
if(list.a[i]!=vua){
p.a[++j]=list.a[i];
i++;
}
if(list.a[i]==vua) i++;
}
p.len=j;
Show_List(p);
return p;
}
这道题目没想出来,只能占用一点存储空间了嘿嘿。
//双向循环链表之交换某位置的直接前驱
void change(Hlist list,int pos) {
Hlist p,t;
if(list->next==NULL) return ;
if(pos<1||pos>MAXSIZE) return ;
p=list;
while(p!=NULL){
p=p->next;
pos--;
if(pos<1){break;}
}
p->prior->next=p->next;
p->next->prior=p->prior;
p->prior->prior->next=p;
p->next=p->prior;
p->prior=p->prior->prior;
p->next->prior=p;
}
顺便附上双向循环链表初始化:
//双向循环链表创建
Hlist Init(){
Hlist head,New,tail;int i;
head=(Hlist)malloc(sizeof(List));
head->next==NULL;head->prior==NULL;head->data=0;tail=head;
if(head==NULL){exit(-1);}
for(i=0;i<MAXSIZE;i++){
New=(Hlist)malloc(sizeof(List));
if(New==NULL){exit(-1);}
scanf("%d",&New->data);
tail->next=New;
New->prior=tail;
New->next =NULL;
tail=New;
}
tail->next=head;
head->prior=tail;
return head;
}
有些代码和教材答案不一样,而且教材答案有运行不正确的,以上代码均可运行并且基本上达到题目要求(有一题除外)。写的不好,欢迎各位点评。