单链表

/*参考单链表的基本运算,设计有序单链表的基本运算,主要功能函数如下,
1、初始化有序单链表L。
2、建立一个有序单链表L。存放一组有序数,或产生一组随机数并排序。
3、求有序单链表L的长度。
4、有序单链表L中取出第i个元素。
5、定位函数,确定有序单链表L值为e元素的位置。
6、在有序单链表L插入一个值为e的元素,使其仍有序。
7、删除有序单链表L中所有值为e的元素。
8、将有序单链表L中值为e元素修改值为e1,使其仍有序。
9、将有序单链表L中属于区间[low,high]的数据取出存入新的有序单链表L1。
10、有序单链表LA和有序单链表LB分别存储两个集合A和B,利用归并法分别求出两个集合的并集、交集和差集。*/
#include <cstdlib>
typedef int ElemType;
typedef struct LNode //定义单链表节点类型 
{
    ElemType data;
    struct LNode *next;
}LinkList;
//1、初始化有序单链表L。
void InitList(LinkList *&L)
{
  L=(LinkList *)malloc(sizeof(LinkList));
  L->next=NULL;//创建头结点,其next域置于null
}

//2、建立一个有序单链表L。存放一组有序数,或产生一组随机数并排序。
void CreateListF(LinkList *&L,ElemType a[],int n)//头插法
{
  LinkList *s;
  InitList(L);
 // L->data=a[0];
 //L->next=NULL;
  for(int i=1;i<n;i++)
  { 
    s=(LinkList *)malloc(sizeof(LinkList));
	s->data=a[i];
	s->next=L->next;
	L->next=s;
	//L=s;
  }
}
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法
{
	LinkList *s,*r;//r是尾指针
	L=(LinkList *)malloc(sizeof(LinkList));//创建头结点
	r=L;//r始终指向尾节点,开始时指向头结点
	for(int i=1;i<n;i++)
	{
		 s=(LinkList *)malloc(sizeof(LinkList));
		 s->data=a[i];//创建数据节点s
		 r->next=s;
		 r=s;	
	}
	r->next=NULL;//尾节点next域置为null
}
//3、求有序单链表L的长度。
int ListLength(LinkList *L)
{
	int n=0;
	LinkList *p=L;
	while(p->next!=NULL)
	{
		n++;
		p=p->next;

	}
	return(n); 
}

//4、有序单链表L中取出第i个元素。
int Geti(LinkList *L,int i)
{
	int j=0;
	LinkList *p=L;
	while(j<i-1&&p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
		return(p->data);
	
}

//5、定位函数,确定有序单链表L值为e元素的位置。
int LocateElem(LinkList *L,ElemType e)
{
	int i=1;
	LinkList *p=L->next;//p指向开始结点
	while(p!=NULL&&p->data!=e)
	{
		p=p->next;
		i++;
	}
	if(p==NULL)
		return(0);
	else
		return(i);

}

//6、在有序单链表L插入一个值为e的元素,使其仍有序。
bool ListInsert(LinkList *&L,ElemType e)
{
	int i=1;
	LinkList *q=L->next;//p指向开始结点
	while(q!=NULL&&q->data<e)
	{
		q=q->next;
		i++;
	}
	int j=0;
	LinkList *p=L,*s;
	while(j<i-1&&p!=NULL)
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		 s=(LinkList *)malloc(sizeof(LinkList));//创建新节点
		 s->data=e;
		 s->next=p->next;
		 p->next=s;
		 return true;
		
	}
	
}
void ListInsert2(LinkList *&L,ElemType e)
{
     LinkList *pre=L,*p;
     while(pre->next!=NULL&&pre->next->data<e)
     pre=pre->next;
     p=(LinkList*)malloc(sizeof(LinkList));
     p->data=e;
     p->next=pre->next;
     pre->next=p;
     
}

//7、删除有序单链表L中所有值为e的元素。
void ListDelete(LinkList *&L,ElemType e)
{

	LinkList *p,*r;
	r=L;
	p=L->next;
	while(p!=NULL && p->data!=e)
	{  
		r=p; 
		p=p->next;
	}

	while(p!=NULL && p->data==e)
	{
		r->next=p->next;
		free(p);
		p=r->next; 
	
	
	}
}

//链表的排序
//冒泡排序
void bubblesort(LinkList *&L)
{
	int n=0;
	LinkList *p=L;
	while(p)
	{
		n++;
		p=p->next;
	}//这一步是为了遍历一遍链表,得出表中数据的数量
	for(int i=0;i<n;i++)
	{
		LinkList *q=NULL;
        LinkList *r=L;
		int k=0;
		int j=0;
		while(r&&r->next&&j<n-i)
		{
			if(r->data>r->next->data)
			{
				LinkList *temp=r->next;
				if(q)
				{
					q->next=temp;
				}
				else
				{	L=temp;
				}
				q=temp;
				r->next=temp->next;
				temp->next=r;
				k=0;
			}
			else
			{
				q=r;//q指向r
				r=r->next;//r后移
				k++;
			}
			j++;
		}//end while
		i=i+k;
	}//end for
}
//8、将有序单链表L中值为e元素修改值为e1,使其仍有序。
void change(LinkList *&L,ElemType e,ElemType e1)
{
	int i=1;
	LinkList *p=L->next;//p指向开始结点
	while(p!=NULL&&p->data!=e)
	{
		p=p->next;
		i++;
	}
	    p->data=e1;
//链表的排序
    bubblesort(L);

}
//9、将有序单链表L中属于区间[low,high]的数据取出存入新的有序单链表L1。
void interval(LinkList *&L,ElemType low,ElemType high,LinkList *&L1)
{
	LinkList *p,*q;
	p=L->next;
    q=p->next;
	while(p->data<low)
	{
		p=q;
		q=q->next;
	}
	L1->next=q;
	LinkList *r,*s;
	r=L->next;
	s=r->next;
	while(s->data<high)
	{
		r=s;
		s=s->next;
	}

	r->next=NULL;
	p->next=s;
	
}

//10、有序单链表LA和有序单链表LB分别存储两个集合A和B,利用归并法分别求出两个集合的并集、交集和差集。
void combine(LinkList *&LA,LinkList *&LB,LinkList *&LC)
{
	LinkList *pa,*pb,*pc;
	pa=LA->next;pb=LB->next;
	pc=LC;
	while(pa!=NULL&&pb!=NULL)
	{if(pa->data<pb->data)
	{
		pc->next=pa;
		pc=pa;
		pa=pa->next;
	}
	else if(pa->data>pb->data)
	{
		pc->next=pb;
		pb=pb->next;
	}
	else if(pa->data==pb->data)
	{
		pc->next=pa;
		pc=pa;
        pa=pa->next;
        pb=pb->next;
	}
	if(pa!=NULL)
		pc->next=pa;
	else
		pc->next=pb;
    }
}
//交集
void con(LinkList *&LA,LinkList *&LB,LinkList *&LC)
{
	LinkList *pa,*pb,*pc;
	pa=LA->next;pb=LB->next;
	pc=LC;
	while(pa!=NULL&&pb!=NULL)
	{if(pa->data<pb->data)
	{
		pc->next=pa;
		pa=pa->next;
	}
	else if(pa->data>pb->data)
	{
		pc->next=pb;
		pb=pb->next;
	}
	else if(pa->data==pb->data)
	{
		pc->next=pa;
        pc=pa;
        pa=pa->next;
        pb=pb->next;
	}
    
    }
}
//差集
void omplement(LinkList *&LA,LinkList *&LB,LinkList *&LC)
{
	LinkList *pa,*pb,*pc;
	pa=LA->next;pb=LB->next;
	pc=LC;
	while(pa!=NULL&&pb!=NULL)
	{if(pa->data<pb->data)
	{
		pc->next=pa;
		pc=pa;
		pa=pa->next;
	}
	else if(pa->data>pb->data)
	{
		pc->next=pb;
		pb=pb->next;
	}
	else if(pa->data==pb->data)
	{
		pc->next=pa;
        pa=pa->next;
        pb=pb->next;
	}
	if(pa!=NULL)
		pc->next=pa;
	else
		pc->next=pb;
    }
}

void main()
{
  LinkList *L,*L1,*LA,*LB,*LC;
 // int low,high;
  ElemType a[]={00,22,22,33,44,55,66,77};
  ElemType la[]={00,11,22,33,44}; InitList(LA);CreateListR(LA,la,5); 
  ElemType lb[]={00,33,44,66}; InitList(LB);CreateListR(LB,lb,4); 
  InitList(LC);
  combine(LA,LB,LC);
  con(LA,LB,LC);
  omplement(LA,LB,LC);
  InitList(L);InitList(L1);
  CreateListR(L,a,8); 
  interval(L,10,40,L1);
  bubblesort(L);
  //ListDelete(L,11);
  ListInsert(L,33);
  LocateElem(L,44);
  change(L,44,11);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值