MOOC 2.1 线性表及其实现

Posted mjn1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MOOC 2.1 线性表及其实现相关的知识,希望对你有一定的参考价值。

1. 顺序表

#include <cstdio>
typedef struct LNode *List;
struct LNode

	ElementType Data[MAXSIZE];
	int Last;
;

struct LNode L;
List PtrL;

// 1. 初始化(建立空的顺序表)
List MakeEmpty()

	List PtrL;
	PtrL = (List )malloc(sizoef(struct LNode) );
	PtrL->Last = -1;
	return PtrL;


// 2. 查找
int Find(ElementType X, List PtrL)

	int i = 0;
	while( i <= PtrL->Last && PtrL->Data[i] != X)
		i ++;
	if(i > PtrL->Last)	return -1;	// 如果没有找到, 返回-1 
	else	return i;	// 找到后返回的是存储位置 
 

// 3. 插入(第i(1<=i<=n+1)个位置上插入一个值为X的新元素)
void Insert(ElementType X, int i, List PtrL)

	int j;
	if(PtrL->Last == MAXSIZE - 1)	// 表空间已满, 不能插入 
	
		printf(" 表满 \n");
		return ;
	
	if(i < 1 || i > PtrL->Last + 2)	// 检查插入位置的合法性 
	
		printf(" 位置不合法 \n");
		return ;
	
	for(j = PtrL->Last; j >= i - 1; -- j)
	
		PtrL->Data[j + 1] = PtrL->Data[j];	// 将ai到an倒序向后移动 
	
	PtrL->Data[i - 1] = X;		// 新元素插入 
	PtrL->Last ++;	// last仍指向最后元素 
	return ;
 

// 4. 删除 (删除表第i(1<=i<=n)个位置上的元素)
void  Delete(int i, List PtrL)

	int j;
	if(i < 1 || i > PtrL->Last + 1)	// 检查空表及删除位置的合法性 
	
		printf("不存在第%d个元素\n", i);
		return ;
	
	for(j = i; j <= PtrL->Last; ++ j)
	
		PtrL->Data[j - 1] = PtrL->Data[j];	// 将ai+1~an顺序向前移动 
	
	PtrL->Last --;	// Last仍指向最后元素 
	return ;

  

2. 链表

#include <cstdio>
typedef struct LNode *List;
struct LNode

	ElementType Data;
	List Next;
;

struct Lnode L;
List PtrL;

// 1. 求表长
int Length(List PtrL)

	List p = PtrL;	// p指向表的第一个结点
	int j = 0;
	while( p )
	
		p = p->Next;
		j ++;	// 当前p指向的是第j个结点 
	
	return j;
 

// 2. 查找
// (1) 按序号查找: FindKth;
List FindKth(int K, List PtrL)

	List p = PtrL;
	int i = 1;
	while(p != NULL && i < K)
	
		p = p->Next;
		i ++;
	
	if(i == K)	return p;	// 找到第K个, 返回指针 
	else	return NULL;	// 否则返回空 
 
// (2)	按值查找: Find
List Find(ElementType X, List PtrL)

	List p = PtrL;
	while(p != NULL && p->Data != X)
	
		p = p->Next;
	
	return p;
 

// 3. 插入( 在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点)
List Insert(ElementType X, int i, List PtrL)

	List p, s;
	if(i == 1)		// 新结点插入在表头 
	
		s = (List )malloc(sizeof(struct LNode));	// 申请 填装结点 
		s->Data = X;
		s->Next = PtrL;
		return s;	// 返回新表头指针 
	
	p = Find(i - 1, PtrL);	// 查找第i-1个结点 
	if(p == NULL)	// 第i-1个不存在, 不能插入 
	
		printf(" 参数i错 \n");
		return NULL; 
	
	else
	
		s = (List )malloc(sizeof(struct LNode));	// 申请 填装结点 
		s->Data = X;
		s->Next = p->Next;	// 新结点插入在第i-1个结点的后面 
		p->Next = s;
		return PtrL;
	
 

// 4. 删除
List Delete(int i, List PtrL)

	List p, s;
	if(i == 1)	// 若要是删除的是表的第一个结点 
	
		s = PtrL;	// s指向第一个结点 
		if(PtrL != NULL)	PtrL = PtrL->Next;	// 从链表中删除 
		else	return NULL;
		free(s);	// 释放被删除结点 
		return PtrL;
	
	p = FindKth(i - 1, PtrL);	// 查找第i-1个结点 
	if(p == NULL)
	
		printf("第%d个结点不存在", i - 1);
		return NULL;
	
	else if(p->Next == NULL)
	
		printf("第%d个结点不存在", i);
		return NULL;
	
	else
	
		s = p->Next;	// s指向第i个结点 
		p->Next = s->Next;	// 从链表中删除 
		free(s);		// 释放被删除结点 
		return PtrL;
	

  

以上是关于MOOC 2.1 线性表及其实现的主要内容,如果未能解决你的问题,请参考以下文章

Java数据结构(线性表)--线性表的顺序存储及其实现

数据结构(严蔚敏吴伟民)——读书笔记-2 线性表及其基本运算顺序存储结构

数据结构与算法目录

[从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

线性表及其实现

2.1线性表顺序存储