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;
	}
}

  

posted @ 2019-08-29 15:16  青衫客36  阅读(160)  评论(0编辑  收藏  举报