数据结构的链式存储结构

一些宏定义

# define TRUE 1
# define FALSE 0
# define OK 1
# define ERROR 0


结构体的实现

typedef int ElemType;
typedef int Status;
typedef struct Node
{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList; 


主要功能:

<1>初始化线性表

<2>销毁线性表

<3>清空线性表

<4>判定线性表是否为空

<5>返回线性表数据元素个数

<6>用e返回L中第i个数据元素的值

<7>返回L中第1个与e满足关系的数据元素的位序

<8>查找前驱

<9>查找后继

<10>在L中第i个位置之前插入新的数据元素e,L的长度加1

<11>删除L的第i个数据元素,并用e返回其值,L的长度减1

<12>依次对L的每个数据元素输出


<1>初始化线性表

Status InitList(LinkList *L) 
{ 
    *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
    if(*L==NULL) /* 存储分配失败 */
            return ERROR;
    (*L)->next=NULL; /* 指针域为空 */
    return OK;
}

<2>销毁线性表

void DestroyList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
free(*L); /* 清空头节点 */
return OK;
}

<3>清空线性表

Status ClearList(LinkList *L)
{ 
	LinkList p,q;
	p=(*L)->next;           /*  p指向第一个结点 */
	while(p)                /*  没到表尾 */
	{
		q=p->next;
		free(p);
		p=q;
	}			
	(*L)->next=NULL; /*只留下头节点,其余释放*/
	return OK;
}


销毁的时候,连链表的头也销毁,这样这个链表就不能再使用了
清空的时候,是先保留了链表的头,然后把头后面的所有的都销毁,最后把头里指向下一个的指针设为空,这样就相当与清空了,但这个链表还在,还可以继续使用


<4>判定线性表是否为空

Status ListEmpty(LinkList L)
{
	if (L->next==NULL)
		return TRUE;
	else
		return FALSE;
}

<5>返回线性表数据元素个数

int ListLength(LinkList L)
{
	int i=0;
	LinkList p=L->next;
	while(p)
	{
		i++;
		p=p->next;
	}
	return i;
}

<6>用e返回L中第i个数据元素的值

Status GetElem(LinkList L,int i,ElemType *e)
{

	int j;
	LinkList p;		/* 声明一结点p */
	p = L->next;		/* 让p指向链表L的第一个结点 */
	j = 1;		/*  j为计数器 */
	while (p && j<i)  /* p不为空或者计数器j还没有等于i时,循环继续 */
	{   
		p = p->next;  /* 让p指向下一个结点 */
		++j;
	}
	if ( !p || j>i ) 
		return ERROR;  /*  第i个元素不存在 */
	*e = p->data;   /*  取第i个元素的数据 */
	return OK;
}

<7>返回L中第1个与e满足关系的数据元素的位序

Status LocateElem(LinkList L,ElemType e)
{
	int i = 0;
	LinkList p=L->next;
	while(p)
	{
		i++;
		if (p->data!=e)
			p=p->next;
		else
			break;
	}
	if (i>0&&i<ListLength(L))
		return i;
	else
	{
		printf("查找失败!");
		return FALSE;
	}
}

<8>查找前驱

Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
	LinkList p=L->next;
	if (cur_e==p->data)
	{
		printf("不存在前驱!");
		return ERROR;
	}
	else
	{
		while(p)
		{
			if (p->next->data==cur_e)
			{
				pre_e=p->data;
				break;
			}
			else
				p=p->next;
		}
	}	
	if (!p)
	{
		printf("无此数据!");
		return ERROR;
	}
}

<9>查找后继

Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
	LinkList p=L->next;
	while(p)
	{
		if (p->data==cur_e)
		{
 
			if (p->next!=NULL)
			{
				next_e=p->next->data;
				break;
			}
			else
			{
				printf("不存在后继!");
				return ERROR;
			}	
		}
		else
			p=p->next;
	}
	if (!p)
	{
		printf("无此数据!");
		return ERROR;
	}
}

<10>在L中第i个位置之前插入新的数据元素e

Status ListInsert(LinkList *L,int i,ElemType e)
{
	LinkList p,s;
	p = *L;   
	int j = 0;
	while (p && j < i-1)     /* 寻找第i-1个结点 */
	{
		p = p->next;
		++j;
	} 
	if (!p || j > i-1) 
		return ERROR;   /* 第i-1个元素不存在 */
	s = (LinkList)malloc(sizeof(Node)); 
	s->data = e;  
	s->next = p->next;      /* 将p的后继结点赋值给s的后继  */
	p->next = s;          /* 将s赋值给p的后继 */
	return OK;
}

<11>删除L的第i个数据元素,并用e返回其值

Status ListDelete(LinkList *L,int i,ElemType &e)
{
	int j;
	LinkList p,q;
	p = *L;
	j = 0;
	while (p->next && j < i-1)	/* 寻找前驱,即第i-1个元素 */
	{
        p = p->next;
        ++j;
	}
	if (!(p->next) || j > i) 
	    return ERROR;           /* 第i个元素不存在 */
	q = p->next;
	p->next = q->next;			/* 将q的后继赋值给p的后继 */
	e = q->data;               /* 将q结点中的数据给e */
	free(q);                    /* 让系统回收此结点,释放内存 */
	return OK;
}

<12>依次对L的每个数据元素输出

void ListTraverse(LinkList L)
{
	LinkList p=L->next;  
    while(p)  
    {  
        printf("%d ",p->data); 
        p=p->next; 
    }    
}



数据结构链式存储结构是一种将数据元素以节点的形式通过指针连接起来的存储方式。它与顺序存储结构不同,链式存储结构的节点可以在内存不连续地分布,而且节点之间的逻辑次序与物理次序不一定相同。链式存储结构常见的几种形式包括单链表、双链表和循环链表。 在链式存储结构,每个节点由两部分组成,一部分是存储数据元素的数据域,另一部分是指向下一个节点的指针域。通过这种方式,可以在插入、删除元素时更加灵活,不需要像顺序存储结构一样进行移动和调整。 单链表是最简单的链式存储结构,每个节点只包含一个指向下一个节点的指针。双链表在每个节点同时包含指向前一个节点和后一个节点的指针,可以实现双向遍历。循环链表是一种特殊的链表,尾节点的指针指向头节点,形成一个环形结构。 通过链式存储结构,可以更加灵活地操作数据,但也增加了一定的空间开销和时间复杂度。在选择链式存储结构还是顺序存储结构时,需要根据具体的应用场景和需求进行综合考虑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数据结构-第二章(5)-链式存储结构](https://blog.csdn.net/CltCj/article/details/121569054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值