单链表的实现

<pre name="code" class="cpp">//单链表的实现+链表的bubble 排序

#include "stdafx.h"
#include<malloc.h>

typedef int status;
typedef int elemtype;

typedef struct LNode
{
	elemtype          num;
	struct LNode    *next;
}LNode,*LinkList;


int List_Length(LinkList L)  /*获取单链表的长度*/
{  
	int len = 0;  
	LinkList p;
	
	p = L->next;  

	while( p)  
	{  
		len++;  
		p = p->next;  
	}  

	return len;  
}  

void BubbleSort_L(LinkList L)  
{  
	LinkList pre;  
	LinkList cur;  
	LinkList next;  

	int i, j;  

	i = List_Length(L);  
	printf("\r\nList length is = %d\n", i);  

	while(i != 1)  
	{  
		pre = L;  
		cur = L->next;  
		next = cur->next;  

		j = i;  
		i--;  

		while(j != 1)  
		{  
			j--;  

			if(cur->num  > next->num)  /*前面结点的值大于后面结点的值,交换结点在链表中的位置*/
			{  
				cur->next   = next->next;  
				pre->next   = next;  
				next->next = cur;  
				pre = next;  
				next = cur->next;  
			}  
			else  
			{  
				pre = cur;  
				cur = next;  
				next = next->next;  
			}  
		}  
	}     
}  

void CreatList_L(LinkList *L,int n)/*逆位序输入n个元素的值,创建带头结点的链表L*/
{
	int i;
	LinkList p;

	*L=(LinkList)malloc(sizeof(LNode)); /*创建单链表的head结点*/
	
	if (NULL == *L)
	{
		printf("\r\n Failed to creat the head node.\r\n");
		return;
	}

	(*L)->next=NULL;
	
	for(i = n;  i > 0; i--)
	{
		p=(LinkList)malloc(sizeof(LNode));
		
		if(NULL == p)
		{
			printf("\r\n failed to allocate  list node.]\r\n");
			return;
		}
		scanf("%d",&p->num);

		p->next=(*L)->next; 
		(*L)->next=p;    /*将新分配的结点插入到head 结点之后*/
	}
}


LinkList Creat_List(int n)/*创建一个链表*/
{
	int i;
	LinkList p,L,head;

	head=L=(LinkList)malloc(sizeof(LNode));/*创建一个head结点*/
	
	if(NULL == head)
	{
		printf("\r\n Failed to creat the head node.\r\n");
		return NULL;
	}

	for(i = 0; i < n; i++)
	{
		p=(LinkList)malloc(sizeof(LNode));
		
		if(NULL == p)
		{
			printf("\r\n failed to allocate  list node.\r\n");
			return NULL;
		}

		scanf("%d",&p->num);
		L->next=p;
		L=p;
	}

	p->next=NULL;
	return(head);/*返回链表头结点*/
}


void PrintList(LinkList L)   /*输出链表的函数*/
{	
	LinkList p;
	
	printf("输出该链表:\n");
	
	p=L->next;

	if(NULL == L->next)
	{
		printf("\r\n The list is empty.\r\n");
	}
	else
	{
		while (p)
		{
			printf("%d ",p->num);
			p=p->next;
		}
	}
	printf("\n");
}

status ListInsert_L(LinkList L,int i,elemtype e)/*在带头结点的单链表L中的第i个元素前插入一个值e*/
{
	int j=0;
	LinkList p,q;
	
	p=L;
	while(p && (j < i-1))
	{
		p=p->next;   /*寻址第i-1个结点 */
		j++;
	}

	q = (LinkList)malloc(sizeof(LNode));//申请新结点
	if(NULL == q)
	{
		printf("\r\n Failed to allocat the list node.\r\n");
		return 0;
	}
	q->num=e;
	q->next=p->next; //插入到链表L中 
	p->next=q;

	return 1;
}

status ListDelet_L(LinkList L,int i,elemtype *e)/*在带头结点的单链表L中删除第i个元素并用e返回其值*/
{
	LinkList p,q;
	int j=0;
	p=L;

	while(p->next  && j < i-1)
	{
		p=p->next;
		j++;
	}
	
	if ((NULL == p->next) ||(j > i-1)) /*删除位置不合理*/
	{
		return 0;
	}
	q = p->next;   /*删除并释放结点*/
	p->next = q->next;
	*e = q->num;
	free(q);

	return 1;
}


void MergeList_L(LinkList La,LinkList Lb)/*合并两个递增的链表*/
{
	LinkList pa,pb,h,head;
	
	head=h=(LinkList)malloc(sizeof(LNode));
	h->next=NULL;
	pa=La->next;
	pb=Lb->next;
	
	while(pa&&pb)
	{
		if(pa->num<=pb->num)
		{
			h->next=pa;
			h=h->next;
			pa=pa->next;
		}
		else
		{
			h->next=pb;
			h=h->next;
			pb=pb->next;
		}
	}

	h->next = pa ? pa:pb;//插入剩余段
	free(La); //释放La头结点
	free(Lb);//释放Lb头结点
	PrintList(head);
}


int _tmain(int argc, _TCHAR* argv[])
{
	LinkList La,Lb,Lc,Ld;
	int n,e,k;

	printf("请输入链表La的长度:\n");
	scanf("%d",&n);
	printf("请输入链表La的数据:\n");
	CreatList_L(&La,n);
	PrintList(La);
	
	printf("对链表La进行冒泡排序:\n");
	BubbleSort_L(La);
	printf("冒泡排序后的结果是:\n");
	PrintList(La);

	printf("请输入链表Lb的长度:\n");
	scanf("%d",&n);
	printf("请输入链表Lb的数据:\n");
	Lb=Creat_List(n);
	printf("请输入要Lb插入的数据:\n");
	scanf("%d",&e);
	printf("请输入Lb要插入元素的位置:\n");
	scanf("%d",&n);
	ListInsert_L(Lb,n,e);
	PrintList(Lb);
	printf("请输入Lb要删除的数据的位置:\n");
	scanf("%d",&n);
	printf("Lb被删除的元素是:\n");
	ListDelet_L(La,n,&k);
	printf("%d\n",k);
	PrintList(Lb);

	printf("请输入链表Lc的长度:\n");
	scanf("%d",&n);
	printf("请输入链表Lc的数据:\n");
	Lc=Creat_List(n);
	printf("请输入链表Ld的长度:\n");
	scanf("%d",&n);
	printf("请输入链表Ld的数据:\n");
	Ld=Creat_List(n);
	printf("Lc 和 Ld合并后的链表是:\n");
	MergeList_L(Lc,Ld);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值