ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单链表

2022-02-22 23:31:36  阅读:185  来源: 互联网

标签:node 单链 ListNode Elemtype List next new


不带头节点

.h文件部分

#ifndef LIST_H
#define LIST_H

#include <stdbool.h>
typedef int Elemtype;
typedef int Rank;
typedef struct ListNode
{
	Elemtype data;
	struct ListNode *next;
}ListNode, *List;

void Init(List *L);
bool Empty(List L);
int Length(List L);
ListNode *GetElem(List L, Rank i);
ListNode *LocateElem(List L, Elemtype e);
ListNode *Insert(List *L, int i, Elemtype e);
ListNode *InsertAsSucc(ListNode *p, Elemtype e);
ListNode *InsertAsPred(ListNode *p, Elemtype e);
ListNode *InsertAsFirst(List *L, Elemtype e);
ListNode *InsertAsLast(List *L, Elemtype e);
Elemtype Delete(ListNode *p);
Elemtype DeleteByRank(List *L, Rank i);
void Traverse(List L, void (*Visit)(Elemtype e));
void Clear(List *L);
void Destroy(List *L);
void Reverse(List *L);

#endif

.c文件部分

#include <stdlib.h>
#include <assert.h>

static ListNode *NewNode()
{
	ListNode *new_node = (ListNode *)malloc(sizeof(ListNode));
	assert(new_node);
	return new_node;
}

void Init(List *L)
{
	*L = NULL;
}

bool Empty(List L)
{
	return !L;
}

int Length(List L)
{
	int len = 0; ListNode *p = L;
	while (p)
	{
		p = p->next;
		len++;
	}
	return len;
}

ListNode *GetElem(List L, Rank i)
{
	int j = 0; ListNode *p = L;
	while (j < i && p)
	{
		p = p->next;
		j++;
	}
	if (j == i)
		return p;
	else
		return NULL;
}

ListNode *LocateElem(List L, Elemtype e)
{
	ListNode *p = L;
	while (p && p->data != e)
		p = p->next;
	return p;
}

ListNode *Insert(List *L, int i, Elemtype e)
{
	if (i < 0)
		exit(EXIT_FAILURE);
	else if (i == 0)
	{
		ListNode *new_node = NewNode();
		new_node->data = e;
		new_node->next = *L;
		*L = new_node;
		return new_node;
	}
	else
	{
		ListNode *p = GetElem(*L, i - 1);
		assert(p);
		ListNode *new_node = NewNode();
		new_node->data = e;
		new_node->next = p->next;
		p->next = new_node;
		return new_node;
	}
}

ListNode *InsertAsSucc(ListNode *p, Elemtype e)
{
	assert(p);
	ListNode *new_node = NewNode();
	new_node->data = e;
	new_node->next = p->next;
	p->next = new_node;
	return new_node;
}

ListNode *InsertAsPred(ListNode *p, Elemtype e)
{
	ListNode *newNode = InsertAsSucc(p, e);
	newNode->data = p->data;
	p->data = e;
	return newNode;
}

ListNode *InsertAsFirst(List *L, Elemtype e)
{
	///* 方法一 */
	//InsertAsPred(*L, e);

	/* 方法二 */
	ListNode *new_node = NewNode();
	new_node->data = e;
	new_node->next = *L;
	*L = new_node;
	return new_node;
}

ListNode *InsertAsLast(List *L, Elemtype e)
{
	ListNode *new_node = NewNode();
	new_node->data = e;
	if (!*L)
		*L = new_node;
	else
	{
		ListNode *p = *L;
		while (p->next)
			p = p->next;
		p->next = new_node;
	}
	new_node->next = NULL;
	return new_node;
}

Elemtype Delete(ListNode *p)
{
	assert(p);
	ListNode *q = p->next; Elemtype e = p->data;
	p->data = q->data;
	p->next = q->next;
	free(q);
	return e;
}

Elemtype DeleteByRank(List *L, Rank i)
{
	if (i < 0)
		exit(EXIT_FAILURE);
	else if (i == 0)
	{
		if (!*L)
			exit(EXIT_FAILURE);
		ListNode *p = *L; Elemtype e = (*L)->data;
		*L = (*L)->next;
		free(p);
		return e;
	}
	else
	{
		ListNode *p = GetElem(*L, i-1);
		assert(p); assert(p->next);
		ListNode *q = p->next; Elemtype e = (*L)->next->data;
		p->next = q->next;
		free(q);
		return e;
	}
}

void Traverse(List L, void (*Visit)(Elemtype e))
{
	ListNode *p = L;
	while (p)
	{
		Visit(p->data);
		p = p->next;
	}
}

void Clear(List *L)
{
	ListNode *p = *L;
	while (p)
	{
		*L = (*L)->next;
		free(p);
		p = *L;
	}
}

void Destroy(List *L)
{
	Clear(L);
	free(*L);
}

void Reverse(List *L)
{
	ListNode *p = *L, *q;
	*L = NULL;
	while (p)
	{
		q = p->next;
		p->next = *L;
		*L = p;
		p = q;
	}
}

标签:node,单链,ListNode,Elemtype,List,next,new
来源: https://www.cnblogs.com/itzel/p/15925492.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有