数据结构代码练习03

单链表相关操作
单链表默认结构体
//单链表默认结构体
typedef struct LNode{
	int data;
	struct LNode *next;	
}LNode,*Linklist;
单链表基础操作
//头插法建立单链表 
LinkList List_HeadInsert(LinkList &L){
	LNode *s;
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	L->next=NULL;
	scanf("%d",&x);
	while(x!=9999){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		s->next=L->next;
		L->next=s;
		scanf("%d",&x);
	} 
	return 1;
} 

//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){
	int x;
	L=(LinkList)malloc(sizeof(LNode));
	LNode *s,*r=L;
	scanf("%d",&x);
	while(x!=9999){
		s=(LNode*)malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;
		scanf("%d",&x);
	}
	r->next=NULL;
	return L;
}

//按序号查找结点
LNode *GetElem(LinkList L,int i){
	if(i<1)
		return NULL;
	int j=1;
	LNode *p=L->next;
	while(p!=NULL&&j<i){
		p=p->next;
		j++;
	}
	return p;
}

//按值查找表结点
LNode *LocateElem(LinkList L,Elemtype e){
	LNode *p=L->next;
	while(p!=NULL&&p->data!=e)
		p=p->next;
	return p;
} 

//插入结点
//p=GetElem(L,i-1);
//s->next=p->next;
//p->next=s; 

//删除结点
//p=GetElem(L,i-1);
//q=p->next;
//p->next=q->next;
//free(q); 
单链表相关操作
//
//设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
void del_x(LNode *&L,int x){
	LNode *p;
	if(L==NULL)
		return;
	if(L->data==x){
		p=L;
		L=L->next;
		free(p);
		del_x(L,x);
	}
	else
		del_x(L->next,x);
} 

//
//删除带头节点单链表中值为x的结点
//法一 
void del(LNode *&L,int x){
	LNode *p=L->next,*pre=L,*q;
	while(p!=NULL){
		if(p->data==x){
			q=p;
			pre->next=p->next;
			p=p->next;
			free(q);
		}
		else{
			pre=p;
			p=p->next;
		}
	} 
//法二
void Del(LNode *&L,int x){
	LNode *p=L;
	while(p->next!=NULL){
		if(p->next->data==x){
			LNode *q=p->next;
			p=next=q->next;
			free(q);
		}
		else
			p=p->next;
	} 
} 

//
//删除带头结点单链表中第一个值为x的结点
int finddelete(LNode *&C,int x){
	LNode *p,*q;
	p=C;
	while(p->next!=NULL){
		if(p->next->data==x)
			break;
		p=p->next;
	}
	if(p->next==NULL)
		return 0;
	else
		q=p->next;
		p->next=q->next;
		free(q);
		return 1;
} 

//
//从头到尾反向传输出单链表每个结点的值
void print(LNode *L){
	if(L->next!=NULL)
		print(L->next);
	count <<L->data<< "";
} 

//
//试编写算法将单链表就地逆置
//法一 头插法 
void reverse(LNode *&L){
	LNode *p=L->next,*r;
	L->next=NULL;
	while(p!=NULL){
		r=p->next;
		p->next=L->next;
		L->next=p;
		p=r;
	}
}
//法二 
void Reverse(LNode *&L){
	LNode *p=L->next,*r=p->next;
	LNode *pre;
	p->next=NULL;
	while(r!=NULL){
		pre=p;
		p=r;
		r=r->next;
		p->next=pre;
	}
	L->next=p;
} 

//
//从链表中删除给定值在s到t之间(不包含s,t)的所有元素 
void del(LNode *&L,int s,int t){
	LNode *p=L;
	while(p->next!=NULL){
		if(p->next->data > s && p->next->data < t){
			LNode *u=p->next;
			p->next=u->next;
			free(u);
		}
		else
			p=p->next;
	}
}

//
//在带头结点的单链表中删除最小值点
void del_min(LNode *&L){
	LNode *p=L->next;
	LNode *minp=L;
	while(p->next!=NULL){
		if(p->next->data < minp->next->data)
			minp=p;
		p=p->next;
	}
	LNode *u=minp->next;
	minp->next=u->next;
	free(u);
} 

//
//不带头结点的单链表l中删除最小值点
void del_min(LNode *&L){
	LNode *minp=L;
	LNode *p=L->next;
	while(p!=NULL){
		if(p->data < minp->data)
			minp=p;
		p=p->next;
	}
	if(L==minp){
		L=L->next;
		free(minp);
		return;
	}
	p=L;
	while(p->next!=minp)
		p=p->next;
	p->next=minp->next;
	free(minp);
} 

//
//给定单链表,按递增排序输出单链表中个结点的数据元素,并释放节点所占空间
void del_min(LNode *&head){
	while(head->next!=NULL){
		LNOde *pre=head;
		LNode *p=head->next;
		while(p->next!=NULL){
			if(p->next->data < pre->next->data)
				pre=p;
			p=p->next; 
		}
		count<<pre->next->data<<"";
		LNode *u=pre->next;
		pre->next=u->next;
		free(u);
	}
	free(head);
} 

//
//将一个带头结点的单链表A分解成两个带头结点的单链表AB
//A中含奇数位置元素,B中含偶数位置元素,相对位置不变
Linklist create(LNode *&A){
	LNode *B=new LNode;
	B->next=NULL;
	LNode *ra=A,*rb=B,*p=A->next;
	A->next=NULL;
	while(p!=NULL){
		ra->next=p;
		ra=p;
		p=p->next;
		rb->next=p;
		rb=p;
		if(p!=NULL)
			p=p->next; 
	}
	ra->next=NULL;
	return B;
} 

//
//将一个单链表(a1,b1,a2,b2...an,bn)拆分成(a1,a2..an)和(bn,bn-1,...b1)
Linklist create(LNode *&A){
	LNode *B=new LNode;
	B->next=NULL;
	LNode *ra=A,*p=A->next,*q;
	A->next=NULL;
	while(p!=NULL){
		ra->next=p;
		ra=p;
		p=p->next;
		q=p;
		if(q==NULL)
			break;
		p=p->next;
		q->next=B->next;
		B->next=q;	
	}
	ra->next=NULL;
	return B;
} 

//
//删除递增链表中重复的元素
void del(LNode *&L){
	LNode *p=L->next;
	LNode *q;
	if(p==NULL)
		return;
	while(p->next!=NULL){
		q=p->next;
		if(p->data==q->data){
			p->next=q->next;
			free(q);
		} 
		else
			p=p->next;
	}	
} 

//
//两个递增有序的单链表,合并成一个非递减有序的链表
void fun(LNode *&A,LNode *&B){
	LNode *p=A->next,*q=B->next;
	A->next=NULL;
	B->next=NULL;
	LNode *ra=A;
	while(p!=NULL&&q!=NULL){
		if(p->data <= q->data){
			ra->next=p;
			p=p->next;
			ra=ra->next;
		}
		else{
			ra->next=q;
			q=q->next;
			ra=ra->next;
		}
	} 
	if(p!=NULL)
		ra->next=p;
	if(q!=NULL)
		ra->next=q;
} 

//
//两个递增有序地单链表,设计成一个非递增有序的链表
void fun(LNode *&A,LNode *&B){
	LNode *p=A->next,*q=B->next,*s;
	A->next=NULL;
	B->next=NULL;
	while(p!=NULL&&q!=NULL){
		if(p->data <= q->data){
			s=p;
			p=p->next;
			s->next=A->next;
			A->next=s;
		}
		else{
			s=q;
			q=q->next;
			s->next=A->next;
			A->next=s;
		}
}
while(p!=NULL){
	s=p;
	p=p->next;
	s->next=A->next;
	A->next=s;
}
while(q!=NULL){
	s=q;
	q=q->next;
	s->next=A->next;
	A->next=s;
}
}

//
//AB两个单链表递增有序,从AB中找出公共元素产生单链表C
//要求不破坏AB结点
Linklist common(LNode *A,LNode *B){
	LNode *p=A->next;
	Lnode *q=B->next;
	LNode *C=new LNode;
	LNode *r=C,*s;
	while(p!=NUll&&q!=NULL){
		if(p->data < q->data)
			p=p->next;
		else if(p->data > q->data)
			q=q->next;
		else{
			s=new LNode;
			s->data=p->data;
			r->next=s;
			r=s;
			p=p->next;
			q=q->next; 
		} 
	}
	r->next=NULL;
	return C;
} 
#include<stdio.h>
#include<malloc.h>
struct node//先定义一个结构体,里面包含数据与结构体指针
{
	int data;
	struct node* next;
};
int main()
{
	struct node* head, * tail, * p;
	head = (struct node*)malloc(sizeof(struct node));//先在头指针开辟一个存储空间,但是不储存数据
	head->data = 9;
	head->next = NULL;//初始化头指针指向空指针
	tail = NULL;//尾指针初始化为空指针
	int x;
	int n;
	scanf("%d", &n);//输入想要的数字n个
	int i = 0;
	//输入数组
	while (i<n)
	{
		p = (struct node*)malloc(sizeof(struct node));
		scanf("%d", &x);
		p->data = x;
		p->next = NULL;//p的指向下一个指针为空指针
		if (head->next == NULL)
			head->next = p;//固定头指针指向的指针,然后保持不变
		else
			tail->next = p;//此时的空间是新开辟的空间,tail->next即是上一个空间p->next
		tail = p;//为指针指向p,可以理解作为一个桥梁,用来储存是一个指向的空间
		i++;
	}
	//输出数组
	int j;
	for (j = 0, p = head->next; j < n; p = p->next,j++)
		printf("%d ", p->data);
	return 0;
}//实现链表输入输出功能

//
// AB两个单链表递增有序,从AB中找出公共元素存放于A
void Union(Lnode *&A,LNode *&B){
	LNode *p=A->next,*q=B->next;
	LNode *ra=A,*u;
	while(P!=NULL&&q!=NULL){
		if(q->data < p->data){
			u=p;
			p=p->next;
			free(u); 
		}
		else if(p->data > p->data){
			u=q;
			q=q->next;
			free(u);
		}
		else{
			ra->next=p;
			ra=p;
			p=p->next;
			u=p;
			q=q->next;
			free(u);
		}
	}
	while(p!=NULL){
		u=p;
		p=p->next;
		free(u);
	}
	while(q!=NULL){
		u=q;
		q=q->next;
		free(u);
	}
	ra->next=NULL;
	free(q);
} 

//
//查找单链表中倒数第K个结点,若成功输出该节点data,并返回1,否则返回0
int find(LNode *head,int k){
	LNode *q=head->next;
	LNode *p=head;
	int i=1;
	while(q!=NULL){
		q=q->next;
		++i;
		if(i>=k)
			p=p->next;
	}
	if(p==next)
		return 0;
	else
	{
		count<<p->next;
		return 1;
	 } 
}

//
//用单链表保存m个整数,并且|data|<=n
//设计时间复杂度尽可能高效的算法,对于data绝对值相等的点,仅保留第一次出现的点
void fun(LNode *&head,int n){
 	LNode *p=head;
 	LNode *r;
 	int *q=new int[n];
 	int m;
 	for(int i=0;i<n;++1)
 		q[i]=0;
 	while(p->next!=NULL){
 		if(p->next->data > 0)
 			m=p->next->data;
 		else
 			m=-p->next->data;
 		if(q[m-1]==0)
		 	q[m-1]=1;
			p=p->next; 
	 } 
	 else{
	 	r=p->next; 
	 	p->next=r->next;
	 	free(r);
	 }
 } 
free(q);

//
//判断带头结点的循环双链表是否对称
int fun(DNode *L){
	DNode *p=L->next;
	DNode *q=L->prior;
	while(p!=q&&q->next!=p){
		if(p->data == q->data){
			p=p->next;
			q=q->prior;
		} 
	}
	else
		return 0;
	return 1;
} 

//
//有两个循环单链表,链表头指针分别为h1,h2
//编写函数将h2链接到h1之后,要求链接后仍保持循环链表形式
void link(LNode *&h1,LNode *&h2){
	LNode *p,*q;
	p=h1,q=h2;
	while(p->next!=h1)
		p=p->next;
	while(q->next!=h2)
		q=q->next;
	p->next=h2;
	q->next=h1;
} 


//
//设有一个带头结点的循环单链表,其结点值为正整数
//设计算法反复找出链表中最小值并不断输出,并将结点从链表中删除,直至链表为空,再删除表头结点
void del(LNode *&L){
	LNode *p,*minp,*u;
	while(L->next!=L){
		p=L->next;
		minp=L;
		while(p->next!=L){
			if(p->next->data < minp->next->data){
				minp=p;
			p=p->next;
			}
		}
		printf("%d",minp->next->data);
//		count<<minp->next->data<<end1;
		u=minp->next;
		minp->next=u->next;
		free(u);	
	}
	free(L);
} 

//
//判断单链表是否有环
int find(LNode *L){
	LNode *fast=L,*slow=L;
	while(fast&&fast->next){
		slow=slow->next;
		fast=fast->next->next;
		if(slow==fast) 
			return 1;
	}
	return 0;
} 

//
//给定一个单链表L(a1,a2,a3...an)将其重新排列为(a1,an,a2,an-1...)
Linklist divrev(LNode *&L){
	LNode *p=L,*q=l;
	while(q!=NULL&&q->next!=NULL){
		p=p->next;
		q=q->next->next; 
	}
	LNode *L1=new LNode;
	L1->next=p->next;
	p->next=NULL;
	LNode *p1=L1->next,*r;
	L1->next=NULL;
	while(p!=NULL){
		r=p1->next;
		p1->next=L1->next;
		L1->next=p1;
		p1=r; 
	} 
	return L1;
} 
void merge(LNode *&L){
	LNode *r,*s;
	LNode *p=L->next,*q=L1->next;
	L1->next=NULL;
	while(q!=NULL){
		r=p->next;
		s=q->next;
		p->next=q;
		q->next=r;
		p=r;
		q=s;
	}
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值