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 线性表及其实现的主要内容,如果未能解决你的问题,请参考以下文章
数据结构(严蔚敏吴伟民)——读书笔记-2 线性表及其基本运算顺序存储结构