顺序表
结构体:
struct Stud1 {
public int no;
public string name;
public double score;
}
类名:StudClass
成员变量:最大长度MaxSize
const int MaxSize = 100;
实例化一个结构体对象st
Stud1[] st = new Stud1[MaxSize];
表长 int n;
方法:
- 创建顺序表
public void Create()
关键点:需记住结构体的调用 st[0].属性=;
- 根据位置查找元素
public bool Findi(int i, out string na, out double sc)
关键点:用了out 需要在方法中初始化
na = "";
sc = 0;
线性表(链式存储)
注:指针对象与结点对象的区别,LinkList s;//指针对象,没有初始化
LinkList() s = new LinkList();//结点对象,初始化了
指针类:
类名:LinkList
成员变量:数据域data
指针域LinkList next
链表类:
类名:LinkListClass
注:需先实例化一个指针对象(LinkList)head头指针
方法:
- 头插法建立单链表(即一致在头结点和首结点之间插入结点)
public void CreateListF(string[] split)
关键点:通过实例化一个结点对象s将字符数组中的元素遍历到s.data(迭代方式s = s.next)
初始化head=null,并迭代head.next=s(即每次新建一个结点,都head.next=它)
- 尾插法建立单链表
public void CreateListR(string[] split)
关键点:通过实例化一个指针对象r,将r指向头结点,同时也实例化一个s结点对象,将数组中的元素存入s.data中,并令r=s(即一直随插入结点移动),最后令尾节点为空r.next=null
- 将链表一字符串形式返回
public string DispList()
关键点:实例化一个指针对象r,将r指向head.next,迭代r.data
- 求链表的长度
public int ListLength()
关键点:实例化一个指针对象r,让r刚开始指向头结点,只要r.next不等于空,迭代,并令一个数字+1
- 求链表中某个位置数据元素的值
public bool GetElem(int i,out string e)
关键点:实例化一个指针对象,并让该指针对象指向头结点,只要r.next!=null迭代找到i-1位置并赋值给e
- 按元素值找位置
public int LocateElem(string e)
关键点:实例化一个指针对象r指向头结点,只要r.next!=null迭代找到r.data==e(在这过程中用数字迭代位置)
- 插入元素
public bool ListInsert(int i, string e)
关键点:实例化一个指针p指向头结点,找到i-1位置,实例化一个结点对象r,令r.data=e,
r.next=(p.next).next,p.next=r
顺序串
注:本类的成员变量调用不需要写类对象(如直接data,其他类需要通过实例化的类对象调用成员变量)
类名:SqStringClass
成员变量:
最大长度MaxSize
数据域data(字符数组char[])
长度
构造函数
初始化数据域(即为数据与初始化大小)
初始化长度为0
方法:
- 新建串(通过传入字符串新建)
遍历字符串数组传给data数组
根据字符串长度修改串长
public void StrAssign(string str)
- 复制串(即将一个串复制给另一个串)
public void StrCopy(SqStringClass a)
- 求串长
public int StrLength()
- 串连接(通过实例化一个nstr对象分别将两个串对象数据(一个本身一个传入的对象)赋值给nstr)
public SqStringClass ConStr(SqStringClass a)
注:涉及到要在串的内部进行插入删除或求字串的方法,需要对传入的位置参数(逻辑下标)进行判断,起始点不能小于0,终点不能大于length+1(且很多方法需实例化第三个串并对它操作,最后返回它)
- 串插入(串插入,在逻辑位置i的位置插入串s,给新串nstr)
public SqStringClass InsStr(int i, SqStringClass s)
- 串删除(串删除, 删除的起始下标为i-1,结束下标为i + j -1)
public SqStringClass DelStr(int i, int j)
- 串替换(替换起始下标i-1,结束下标j + i -1)
public SqStringClass RepStr(int i, int j ,SqStringClass s)
注:以上的i 代表从第i个开始,j代表从i开始长度为j的相应的串位置进行操作
顺序栈
注意:进栈操作需判断栈是否已满即top==MaxSize-1
出栈操作需判断是否栈为空即top==-1
进出栈直接对数据域data进行操作如 string e = data[top];top--;
Data[top]= e;top++;
类名:SqStackClass
成员变量:最大长度 MaxSize
数据域 data(字符串数组)
栈顶指针
构造函数:为数据域分配存储空间即data = new string[MaxSize];
栈顶指针初始化 top = -1;
方法:
- 判断栈是否为空
public bool StackEmpty()//直接return{top == -1};
- 进栈
public bool Push(string e)
- 出栈
public bool Pop(out string e)
- 取栈顶元素
public bool GetTop(out string e)//只是取,所以不用top--
- 输出栈中所有元素,以字符串返回
public string DispStack()//实例化一个字符串对象mystr返回,遍历栈(条件top != -1)
二维数组(行列优先存储,通过行列下标求元素位置)
关键点:通过实例化六个全局变量,即:
int c1;//数组行起始下标
int d1;//数组行终止下标
int c2;//数组列起始下标
int d2;//数组列终止下标
int loc;//数组起始位置
int k;//数组元素大小
然后分别更具行有先或列优先存储公式进行计算
//行优先存储
locij = loc + ((i - c1) * (d2 - c2 + 1) + (j - c2)) * k;
locij = loc + ((j - c2) * (d1 - c1 + 1) + (i - c1)) * k;
二叉树
类名:BTNodeClass
内部类:BTNode
成员变量:数据域data(char)
BTNode结点对象(指向左孩子):lchild
BTNode结点对象(指向右孩子):rchild
成员变量:最大长度 MaxSize(用于顺序栈的存储空间分配)
BTNode(根结点对象)r
递归算法返回字符串bstr(string)
构造方法:初始化二叉树,即
r.lchild = r.rchild = null;
方法:
- 由输入的括号表达式的字符串创建二叉链
public void CtreateBTNode(string str)
关键点:需通过实例化一个顺序栈(数据类型BTNode,BTNode[] st = new BTNode[MaxiSize])
用于存储括号表达式中的结点。用循环嵌套switch对’(’ ‘)’ ‘,’进行判断
且通过定义一个int k来对相应的判断赋值,k=1 左孩子 k=2右孩子
BTNode[] st = new BTNode[MaxSize];//创建一个顺序栈
BTNode p = null;
int top = -1, k = 0, j = 0;
char ch;
r = null;//建立二叉树初始时为空
while (j < str.Length)
{//遍历数组str中的字符
ch = str[j];
switch (ch)
{
case '(':
//开始处理左孩子结点
top++;
st[top] = p;
k = 1;
break;
case ')':
top--;
break;
case ',':
//开始处理右孩子结点
k = 2;
break;
default:
//创建一个新的结点
p = new BTNode();
p.lchild = p.rchild = null;
p.data = ch;
if (r == null)//如果根结点为空
{
r = p;//则将p赋值给r
}
else
{
switch (k)
{//否则对k进行遍历
//默认1为左孩子,为2为右孩子
case 1:
st[top].lchild = p;
break;
case 2:
st[top].rchild = p;
break;
}
}
break;
}
j++;
}
- 求二叉树的高度
public int Count()
{
return Count1(r);
}
private int Count1(BTNode t)
关键点:先判断根结点是否为空,然后通过方法重复执行来计数
- 将二叉树转化成括号表示法,以字符串返回
public string DispBTNode()
{
btstr = "";
DispBTNode1(r);
return btstr;
}
private void DispBTNode1(BTNode t)
关键点:判断根结点是否为空,先将根节点的t.data.string赋值给btstr,然后判断根结点的左右孩子是否存在
btstr += t.data.ToString();
if (t.lchild != null || t.rchild != null)
{
btstr += "(";
DispBTNode1(t.lchild);
if (t.rchild != null)
{
btstr += ",";
}
DispBTNode1(t.rchild);
btstr += ")";
}
- 求总结点个数
public int Count()
{
return Count1(r);
}
private int Count1(BTNode t)
关键点:通过对结点反复调用Count1()函数,来进行计数,以下计数方法同理
n1 = Count1(t.lchild);
n2 = Count1(t.rchild);
return n1 + n2 + 1;//
- 求叶子结点个数
public int LeafCount()
{
return LeafCount1(r);
}
private int LeafCount1(BTNode t)
- 求单分支结点个数
public int SingleCount()
{
return SingleCount1(r);
}
private int SingleCount1(BTNode t)
- 求双分支结点个数
public int DoubleCount()
{
return DoubleCount1(r);
}
private int DoubleCount1(BTNode t)
注:求结点个数的方法都以int类型返回