学习笔记------数据结构(C语言版) 扩展的线性单链表及归并

//Function realization.cpp

#include"predefined.h"
#include"ExtenLinkedList.h"
Status MakeNode_E(Link *p,ElemType e)
//分配由p指向的值为e的结点,并返回OK;
//若分配失败,则返回ERROE。
{
	(*p)=(Link)malloc(sizeof(LNode));
	if(!(*p)) exit(OVERFLOW);
	(**p).data=e;
	(**p).next=NULL;
	return OK;
}

void FreeNode_E(Link *p)
//释放p所指的结点。
{
	free(*p);
	*p=NULL;
}

Status InitList_E(LinkList *L)
//构造一个空的线性链表L。
{
	Link p;
	p=(Link)malloc(sizeof(LNode));
	if(!p) exit(OVERFLOW);
	(*p).next=NULL;
	(*p).data=0;
	(*L).head=(*L).tail=p;
	(*L).len=0;
	return OK;
}

Status DestroyList_E(LinkList *L)
//销毁线性链表L,L不再存在。
{
	Link p,q;  
	p=(*L).head;  
    while(p)  
    {  
        q=p;
  		p=(*p).next;
		free(q); 
    }
	(*L).head=(*L).tail=NULL;
	(*L).len=0;
    return OK;
}

Status ClearList_E(LinkList *L)
//将线性链表L重置为空表,并释放原链表的结点空间。
{
	Link p,q;
	p=(*(*L).head).next;
	while(p)
	{
		q=p;
		p=(*p).next;
		free(q);
	}
	(*(*L).head).next=NULL;
	(*L).len=0;
	(*L).tail=(*L).head;
	return OK;
}

Status InsFirst_E(LinkList *L,Link h,Link s)
//已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前。
{
	(*s).next=(*h).next;
	(*h).next=s;
	(*L).len++;
	if((*L).tail==h) (*L).tail=s;
	return OK;
}

Status DelFirst_E(LinkList *L,Link h,Link *q)
//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回。
{
	if(!((*h).next)) return ERROR;
	if(!(*(*h).next).next) (*L).tail=(*L).head;
	*q=(*h).next;
	(*h).next=(*(*h).next).next;
	(*L).len--;
	return OK;
}

Status Append_E(LinkList *L,Link s)
//将指针s所指(彼此以指针相连)的一串结点链接在线性表L的最后一个结点
//之后,并改变链表L的尾指针指向新的尾结点。
{
	Link p,q;
	int count=0;
	p=(*L).tail;
	(*p).next=s;
	while(s)
	{
		q=s;
		s=(*s).next;
		count++;
	}
	(*L).tail=q;
	(*L).len+=count;
	return OK;
}

Status Remove_E(LinkList *L,Link *q)
//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点。
{
	Link p,r;
	p=(*L).head;
	if(p)
	{
		while((*p).next)
		{
			r=p;
			p=(*p).next;
		}
		(*r).next=NULL;
		*q=p;
		(*L).tail=r;
		(*L).len--;
		return OK;
	}
	*q=NULL;
	return FALSE;
}

Status InsBefore_E(LinkList *L,Link *p,Link s)
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,
//并修改指针p指向新插入的结点。
{
	if(!(*p)||(*L).head==*p||!(*L).head) return ERROR;
	Link q,r;
	q=(*L).head;
	while(!(q==*p))
	{
		r=q;
		q=(*q).next;
		if(!q) return ERROR;
	}
	(*s).next=*p;
	(*r).next=s;
	*p=s;
	(*L).len++;
	return OK;
}

Status InsAfter_E(LinkList *L,Link *p,Link s)
//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,
//并修改指针p指向新插入的结点。
{
	if(!(*p)||!(*L).head) return ERROR;
	Link q;
	(*s).next=(**p).next;
	(**p).next=s;
	if(!(**p).next) (*L).tail=s;
	*p==s;
	(*L).len++;
	return OK;
}

Status SetCurElem_E(Link *p,ElemType e)
//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值。
{
	if(!(*p)) return ERROR;
	(**p).data
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值