线性表的链式存储

/********************************************************************
	created:	2014/12/18
	created:	18:12:2014   14:41
	filename: 	D:\visual studio 2012\Projects\List\List\Linklist.h
	file path:	D:\visual studio 2012\Projects\List\List
	file base:	Linklist
	file ext:	h
	author:		HanLuo
	
	purpose:	线性表的链式存储结构

	注意:头结点与头指针的异同

	查找:顺序存储O(1)
		  单链表O(n)
	插入和删除更加高效
	顺序存储需要预先分配空间,容易造成浪费
	链表不需要

	缺点: 不便于查找读取。
*********************************************************************/
#ifndef _LINK_LIST_H_
#define _LINK_LIST_H_

class Node;

enum Status
{
	FALSE = 0,
	TRUE  = 1,
};

typedef int ElemType;

// 定义Linklist,
/*
	linklist->nextNode  就是第一个结点
*/

typedef Node* Linklist;

class Node
{
public:
	// 初始化线性表
	Status InitList(Linklist *linklist);

	// 线性表已存在,获取链表中的第i个元素
	Status GetElem(Linklist l, int i, ElemType *val);

	// 线性表已存在,为空表就返回真,否则,返回假。
	Status ListEmpty(Linklist linklist);

	// 线性表已存在,将表重置为空表
	Status ClearList(Linklist *linklist);

	// 线性表已存在,返回链表中的元素个数
	int ListLength(Linklist linklist);

	/* 初始条件:顺序线性表L已存在 */
	/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
	/* 若这样的数据元素不存在,则返回值为0 */
	int LocateElem(Linklist linklist, ElemType val);

	/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
	/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
	Status ListInsert(Linklist* linklist, int i, ElemType val);

	/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
	/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
	Status ListDelete(Linklist* linklist, int i, ElemType *val);

	/* 初始条件:顺序线性表L已存在 */
	/* 操作结果:依次对L的每个数据元素输出 */
	Status ListTraverse(Linklist linklist);

	/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
	void CreateListHead(Linklist *linklist, int n);

	/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
	void CreateListTail(Linklist *linklisr, int n);

private:
	Status visit(ElemType val);

	ElemType data;					// 数据域
	Node* nextNode;					// 指针域
};

#endif
</pre><pre code_snippet_id="572213" snippet_file_name="blog_20150105_3_8945237" name="code" class="cpp"><pre name="code" class="cpp">#include "Linklist.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

//
Status Node::visit(ElemType val)
{
	printf("%d", val);
	return TRUE;
}

//
Status Node::InitList(Linklist *linklist)
{
	// 初始化链表
	// 产生头结点,并使linklist指向此头结点
	*linklist = (Linklist)malloc(sizeof(Node));
	if(!(*linklist))	// 存储分配失败
		return FALSE;
	(*linklist)->nextNode = NULL; // 指针域为空

	return TRUE;
}

//
Status Node::ListEmpty(Linklist linklist)
{
	if(linklist->nextNode)
		return FALSE;
	else 
		return TRUE;
}

//
Status Node::ClearList(Linklist *linklist)
{
	 Linklist p, q;
	 p = (*linklist)->nextNode;			// 指向第一个节点
	 if(p)
	 {
		 q = p->nextNode;				// p是第一个节点   p->nextNode第二个结点
		 free(p);
		 p = q;
	 }
	 (*linklist)->nextNode = NULL;		// 头结点指针域为空		
	 return TRUE;
}

//
int Node::ListLength(Linklist linklist)
{
	int i = 0;
	Linklist p = linklist->nextNode;
	while(p)
	{
		i++;
		p = p->nextNode;
	}

	return i;
}

//
Status Node::GetElem(Linklist linklist, int i, ElemType *val)
{
	int j;
	Linklist p;					// 声明一个结点p

	p = linklist->nextNode;		// 让p指向链表linklist的第一个结点

	j = 1;						// j为计数器
	while( p && j < i)			// p不为空或者计数器j还没有等于i时,循环继续
	{
		p = p->nextNode;		// 让p指向下一个结点
		j++;
	}
	if(!p || j > i)
		return FALSE;			// 第i个元素不存在

	(*val) = p->data;			// 取出数据
		return TRUE;	
}

//
int Node::LocateElem(Linklist linklist, ElemType val)
{
	int i = 0;
	Linklist p = linklist->nextNode;

	while(p)
	{
		i++;
		if(p->data == val)		// 找到了这个元素
			return i;
		p = p->nextNode;		// 循环下一个
	}

	return 0;
}

//
Status Node::ListInsert(Linklist* linklist, int i, ElemType val)
{
	int j;
	Linklist p, s;
	p = *linklist;			// 头结点
	j = 1;

	while(p && j < i)
	{
		p = p->nextNode;
		++j;
	}

	if(!p || j > i)				// 到达尾结点
		return FALSE;

	s = (Linklist)malloc(sizeof(Node));		// 生成一个新的结点
	s->data = val;
	s->nextNode = p->nextNode;
	p->nextNode = s;

	return TRUE;
}

//
Status Node::ListDelete(Linklist* linklist, int i, ElemType *val)
{
	int j;
	Linklist p, q;
	p = *linklist;
	j = 1;
	
	while(p && j < i)			// 遍历寻找i个元素
	{
		p = p->nextNode;
		++j;
	}

	if(!(p->nextNode) || j > i)		// i个元素不存在
		return FALSE;

	q = p->nextNode;
	p->nextNode = q->nextNode;
	*val = q->data;
	free(q);

	return TRUE;

}

//
Status Node::ListTraverse(Linklist linklist)
{
	Linklist p = linklist->nextNode;
	while(p)
	{
		visit(p->data);
		p = p->nextNode;
	}
	printf("\n");
	return TRUE;
}

//
void Node::CreateListHead(Linklist *linklist, int n)
{
	Linklist p;
	int i;
	srand(time(0));
	*linklist = (Linklist)malloc(sizeof(Node));

	// 先建立一个带头结点的单链表
	(*linklist)->nextNode = NULL;

	for(i = 0; i < n; i++)
	{
		p = (Linklist)malloc(sizeof(Node));		// 生成新的结点
		p->data = rand()%100 + 1;
		p->nextNode = (*linklist)->nextNode;
		(*linklist)->nextNode = p;				// 插入到头结点的后面
	}
}

//
void Node::CreateListTail(Linklist *linklist, int n)
{
	Linklist p ,r;
	int i;
	srand(time(0));
	*linklist = (Linklist)malloc(sizeof(Node));	// linklist 为整个线性表
	r = *linklist;								// r为指向尾部的结点

	for(i = 0; i < n; i++)
	{
		p = (Linklist)malloc(sizeof(Node));
		p->data = rand()%100 + 1;
		r->nextNode = p;
		r = p;
	}
	r->nextNode = NULL;
}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值