数据结构作业2(单链表)

完成过程可谓是艰辛,尤其是删除操作的各种情况!

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef int ElemType ;
typedef struct Node{
	ElemType data ;
	struct Node *next ;
}Lnode; 

Lnode *create(int n)
{
	Lnode *head , *p , *q ;
	int i ;
	head = (Lnode *)malloc(sizeof(Lnode)) ;
	head->next = NULL ;
	q = head ;
	for(i = 0 ; i < n ; i ++)
	{
		p = (Lnode *) malloc(sizeof(Lnode)) ;
		scanf("%d",&p->data) ;
		q->next = p ;
		p->next = NULL ;
		q = p ;
	}
	
	return head ;
}

Lnode *get(Lnode *L , int i)
{
	Lnode *p ;
	int j = 0 ;
	p = L ;
	while(p->next != NULL && j < i) p = p->next , j ++ ;
	
	if(i == j) return p ;
	else return NULL ;
}

int insert(Lnode *L , int i , ElemType x)
{
	Lnode *p , *q ;
	int j = i - 1 ;
	if(get(L , i - 1) == NULL) 
	{
		printf("Insertion location invalid\n") ;
		return 0 ;
	}
	else
	{
		p = get(L , i - 1) ;
		q = (Lnode *) malloc(sizeof(Lnode)) ;
		q->data = x ;
		q->next = p->next ;
		p->next = q ;
		return 1 ;
	}
}

Lnode *locate(Lnode *L , ElemType x)
{
	Lnode *p ;
	p = L->next ;
	while(p != NULL)
	{
		if(p->data == x)
		{
			return p ;
		}
		else 
		{
			p = p->next ;
		}
	}
	
	return p ;
}

Lnode *deleteElem(Lnode *L , ElemType x)
{
	Lnode *p , *q , *head ;
	while(L->data == x) L = L->next ;
	head = L ;
	p = head ;
	q = p->next ;
	while(q != NULL)
	{
		if(q->data == x)
		{
			p->next = p->next->next ;
			q = p->next ;
		}
		else
		{
			p = q ;
			q = q->next ;
		}
	}
	
	return head ; 
}

void display(Lnode *L)
{
	Lnode *p ;
	p = L->next ;
	while(p != NULL)
	{
		printf("%d\t",p->data) ;
		p = p->next ;
	}
	puts("") ;
	
	return ; 
}

Lnode *merge(Lnode *La , Lnode *Lb )
{
	display(La) ;
	display(Lb) ;
	Lnode *p , *head , *q;
	head = (Lnode *) malloc (sizeof(Lnode)) ;
	head->next = NULL ;
	p = head ;
	La = La->next , Lb = Lb->next ;
	while(La != NULL && Lb != NULL)
	{
		
		if(Lb->data < La->data)
		{
			head->next = Lb ;
			head = head->next ;
			Lb = Lb->next ;
		}
		else 
		{
			head->next = La ;
			head = head->next ;
			La = La->next ;
		}
		
	}
	while(La != NULL)
	{
		
		head->next = La ;
			head = head->next ;
			La = La->next ;
	}
	while(Lb != NULL)
	{
	
		head->next = Lb ;
			head = head->next ;
			Lb = Lb->next ;
	}
	
	
	return p ;
}

int lengh(Lnode *L)
{
	int res = 0 ;
	Lnode *p ;
	p = L->next ;
	while(p != NULL)
	{
		res ++ ;
		p = p->next ;
	}
	
	return res ;
}

void main()
{
	Lnode *L , *La , *Lb , *Lc ;
	int num = 0 ; 
	int mark , size ;
	ElemType a ;
	ElemType x ;
	printf("Please input the num of elements\n") ;
	scanf("%d",&num) ;
	printf("Please input the elements to establish a linked list\n") ;
	L = create(num) ;
	printf("The list stored in linked from is\n") ;
	display(L) ;
	printf("Please input the location and element to be inserted\n") ;
	scanf("%d%d",&mark,&x) ;
	insert(L , mark , x) ;
	display(L) ;
	size = lengh(L);
	printf("The size of the linked list is %d\n",size) ;
	printf("Please input the element to be deleted\n") ;
	scanf("%d",&a) ;
	L = deleteElem(L , a) ;
	display(L) ;
	printf("Please input 2 ordered list\n") ;
	La = create(num) ;
	Lb = create(num) ;
	Lc = merge(La , Lb) ;
	display(Lc) ;
	return ; 
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安特尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值