数据结构习题之链表算法

重温数据结构,当时没有怎么做题,现在回顾下,为以后成为职业人打好基础。

//链表分解算法  
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;
 }

有些代码和教材答案不一样,而且教材答案有运行不正确的,以上代码均可运行并且基本上达到题目要求(有一题除外)。写的不好,欢迎各位点评。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值