目次
実際に事前ステートメントとして直接使用する場合は、オーバーロードを避けるために複数の初期化関数を記述しません。
レビュー:
(すべて以前に記述) 線形テーブルの定義とその演算:
線形テーブルのすべての関数を自分で練習してください。
ステータスおよびノードのデータ型を作成、定義する
スペースを開ける
破壊
空
空のテーブルかどうかを判断する
戻り長さ
i 番目の要素の値を返します
指定された要素の位置を検索します (指定された要素のビット順序を検索します)。
要素を挿入
要素の削除
プリカーサーノード
後継ノード
すべての要素に対する統合された visit() 操作
以上
//线性表的定义及其基础操作
#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit
#include<math.h>//OVERFLOW,exit
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXlength 100 //初始大小为100,可按需修改
struct Poly
{
float p;
int e;
bool operator==(Poly t)
{
return t.p == p && t.e == e;
}
bool operator!=(Poly t)
{
return t.p != p || t.e != e;
}
};
struct Sqlist
{
Poly* elem;
int length;
};
typedef int Status; //函数调用状态
//(1):使用引用<模板>
Status InitList(Sqlist L)
{
// L.elem = (表中数据基本单位类型)malloc(MAXlength * sizeof(表中数据基本单位类型));
//C语言写法,C++写法如下:
//L.elem = new 表中数据基本单位类型[MAXlength]; //在堆区开辟动态内存
if (!L.elem)//分配失败
cerr << "error" << endl; //cerr:常被用于输出出错信息,类似cout
L.length = 0;
return false;
}
//(1):使用引用<实例>
Status InitList(Sqlist& L)//前面定义过了typedef int Status;
{
L.elem = new Poly[100]; //在堆区开辟动态内存
if (!L.elem)//分配失败
exit(OVERFLOW);
L.length = 0;
return OK;
}
//(2):使用指针<实例>
/*初始化线性表*/
Status InitList(Sqlist* L)
{
L->elem = (Poly*)malloc(MAXlength * sizeof(Poly*));
if (!L->elem)
exit(OVERFLOW);
L->length = 0;
return OK;
}
void DestroyList(Sqlist& L)
{
if (L.elem) delete L.elem;
}
void ClearList(Sqlist& L)
{
L.length = 0;
//将线性表的长度设置为0
}
int IsEmpty(Sqlist L)
{
if (L.length == 0)
return true;
else
return false;
}
int Listlength(Sqlist L)
{
return L.length;
}
int GetElem(Sqlist L, int i, Poly ele)//element:元素
{
if (i <= 0 || i > L.length)
return ERROR;
ele = L.elem[i - 1];
return OK;
}
int LocateElem(Sqlist L, Poly i)//查找元素
{
for (int a = 0; a <= L.length; a++)
{
if (i == L.elem[a])
return a + 1;
return 0;
}
}
Status LoacteElem(Sqlist L, Poly e)
{
int i = 0;
if (!&L)//初始条件:L存在
return false;
while (L.elem[i] != e)i++;
if (e == L.elem[i])
cout << "元素位序为:" << i + 1 << endl;
return false;
}
Status LoacteElem(Sqlist& L, Poly e)
{
int i = 0;
if (!&L)//初始条件:L存在
return false;
while (*(L.elem) != e)
{
L.elem = L.elem + 1;
i++;
}
if (e == *(L.elem))
cout << "元素位序为:" << i + 1 << endl;
return false;
}
int ListInsert(Sqlist L, int i, Poly e)
{//insert:插入//i:插入位置(位置序号)
if (i<1 || i>L.length + 1)
return ERROR;
if (L.length == MAXlength)return ERROR;//当前储存空间已满
//把插入位置后面的元素全部往后移
for (int j = L.length - 1; j >= i - 1; j--)//j为下标
L.elem[j + 1] = L.elem[j];
//放元素
L.elem[i - 1] = e;
L.length++;
return 0;
}
int ListDelete(Sqlist L, int i)
{
if (i < 1 || i > L.length)
return ERROR;
for (int j = i - 1; j <= L.length - 1; j++)
L.elem[j] = L.elem[j + 1];
L.length--;
}
Status PriorElem(Sqlist& L, Poly e_current, Poly& e_prior)
{
int i = 0;
if (!&L || L.elem[i] != e_current)
//L存在且e_current不是第一个元素
cerr << "无意义" << endl;
return false;
while (L.elem[i] != e_current)i++;
e_prior = L.elem[i - 1];
return true;
}
Status NextElem(Sqlist& L, Poly e_current, Poly& e_next)
{
int i = L.length - 1;
if (!&L || L.elem[i] != e_current)
//L存在且e_current不是最后一个元素
cerr << "无意义" << endl;
return false;
while (L.elem[i] != e_current)i--;
e_next = L.elem[i + 1];
return true;
}
int visit(Sqlist& L)
{
int i = 0;
while (i < L.length - 1)
{
L.elem->p++;
i++;
}
return true;
}
Status ListTraverse(Sqlist& L)
{
if (!&L)
return false;
int visit();
return true;
}
int main()
{
}
実際に事前ステートメントとして直接使用する場合は、オーバーロードを避けるために複数の初期化関数を記述しません。
//线性表的定义及其基础操作
#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit
#include<math.h>//OVERFLOW,exit
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXlength 100 //初始大小为100,可按需修改
struct Poly
{
float p;
int e;
bool operator==(Poly t)
{
return t.p == p && t.e == e;
}
bool operator!=(Poly t)
{
return t.p != p || t.e != e;
}
};
struct Sqlist
{
Poly* elem;
int length;
};
typedef int Status; //函数调用状态
//(1):使用引用<实例>
Status InitList(Sqlist& L)//前面定义过了typedef int Status;
{
L.elem = new Poly[100]; //在堆区开辟动态内存
if (!L.elem)//分配失败
exit(OVERFLOW);
L.length = 0;
return OK;
}
void DestroyList(Sqlist& L)
{
if (L.elem) delete L.elem;
}
void ClearList(Sqlist& L)
{
L.length = 0;
//将线性表的长度设置为0
}
int IsEmpty(Sqlist L)
{
if (L.length == 0)
return true;
else
return false;
}
int Listlength(Sqlist L)
{
return L.length;
}
int GetElem(Sqlist L, int i, Poly ele)//element:元素
{
if (i <= 0 || i > L.length)
return ERROR;
ele = L.elem[i - 1];
return OK;
}
int LocateElem(Sqlist L, Poly i)//查找元素
{
for (int a = 0; a <= L.length; a++)
{
if (i == L.elem[a])
return a + 1;
return 0;
}
}
Status LoacteElem(Sqlist L, Poly e)
{
int i = 0;
if (!&L)//初始条件:L存在
return false;
while (L.elem[i] != e)i++;
if (e == L.elem[i])
cout << "元素位序为:" << i + 1 << endl;
return false;
}
Status LoacteElem(Sqlist& L, Poly e)
{
int i = 0;
if (!&L)//初始条件:L存在
return false;
while (*(L.elem) != e)
{
L.elem = L.elem + 1;
i++;
}
if (e == *(L.elem))
cout << "元素位序为:" << i + 1 << endl;
return false;
}
int ListInsert(Sqlist L, int i, Poly e)
{//insert:插入//i:插入位置(位置序号)
if (i<1 || i>L.length + 1)
return ERROR;
if (L.length == MAXlength)return ERROR;//当前储存空间已满
//把插入位置后面的元素全部往后移
for (int j = L.length - 1; j >= i - 1; j--)//j为下标
L.elem[j + 1] = L.elem[j];
//放元素
L.elem[i - 1] = e;
L.length++;
return 0;
}
int ListDelete(Sqlist L, int i)
{
if (i < 1 || i > L.length)
return ERROR;
for (int j = i - 1; j <= L.length - 1; j++)
L.elem[j] = L.elem[j + 1];
L.length--;
}
Status PriorElem(Sqlist& L, Poly e_current, Poly& e_prior)
{
int i = 0;
if (!&L || L.elem[i] != e_current)
//L存在且e_current不是第一个元素
cerr << "无意义" << endl;
return false;
while (L.elem[i] != e_current)i++;
e_prior = L.elem[i - 1];
return true;
}
Status NextElem(Sqlist& L, Poly e_current, Poly& e_next)
{
int i = L.length - 1;
if (!&L || L.elem[i] != e_current)
//L存在且e_current不是最后一个元素
cerr << "无意义" << endl;
return false;
while (L.elem[i] != e_current)i--;
e_next = L.elem[i + 1];
return true;
}
int visit(Sqlist& L)
{
int i = 0;
while (i < L.length - 1)
{
L.elem->p++;
i++;
}
return true;
}
Status ListTraverse(Sqlist& L)
{
if (!&L)
return false;
int visit();
return true;
}
(すべて以前に書かれた) リンク リストの定義とその操作:
単一リンクリストを初期化する
リンクされたリストは空ですか
単一リンクリストを破棄する
リンクされたリストをクリアする
テーブルの長さを尋ねる
i 番目の要素を取得します
要素の順序を検索する
要素を挿入
要素の削除
ヘッド挿入
尾栓
以上
//链表的定义及其基础操作
#include<iostream>
using namespace std;
#include<stdlib.h>//存放exit
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXlength 100 //初始大小为100,可按需修改
typedef int Status; //函数调用状态
struct K
{
float a;
int b;
string c;
bool operator==(K& t)
{
return t.a == a && t.b == b;
//&& t.c = c;
}
bool operator!=(K& t)
{
return t.a != a || t.b != b;
//|| t.c = c;
}
};
typedef K Elemtype; //函数调用状态
struct Lnode
//node:结; 结点;
{
Elemtype data;
Lnode* next;
};
typedef Lnode* LinkList;
Status 初始化空单链表(LinkList L)
{//等价于Lnode *&L
L = new Lnode;
L->next = NULL;
return true;
}
Status 链表是否为空(LinkList L)
{
if (L->next)
return true;
else
return false;
}
Status 销毁单链表(LinkList& L)
{
//判断链表是否为空
if (链表是否为空(L))
{
cerr << "empty List!" << endl;
return false;
}
while (L)//链表还未到达尾端
{
auto temp = L->next;//将头指针指向下一个结点
delete L;
L = temp;
}
return true;
}
Status 清空链表(LinkList L)
{
if (链表是否为空(L))
cerr << "链表为空" << endl;
auto temp1 = L->next;
while (temp1)
{
auto temp2 = temp1->next;
delete temp1;
temp1 = temp2;
}
L->next = NULL;
return true;
}
Status 求表长(LinkList L)
{
if (链表是否为空(L))
cerr << "链表为空" << endl;
LinkList p = L->next;
//特别注意:因为这里从首元结点开始算起(计算)
//所以:L->next;
int i = 0;
while (p)//不要写成if
{
p = p->next;
i++;
}
//cout << "表长为: " << i << endl;
return i;
}
Status 取第i个元素(LinkList L, int i, Elemtype e)
{// GetElem“i”
LinkList p;
p = L->next;
int j = 1;
while (p && i > j)
{
p = p->next;
j++;
}
if (i < 0 || i < j || !p)
return false;
e = p->data;
return true;
}
Status LocateELem(LinkList L, Elemtype e)
{
//在线性表L中查找值为e的数据元素
//找到,则返回L中值为e的数据元素的地址,查找失败返回NULL
auto p = L->next; int i = 1;
while (p && p->data != e)
{
i++;
if (e == p->data)
{
cout << "地址为: " << p << ";" << endl;
cout << "位置序号为: " << i << ";" << endl;
}
p = p->next;
}
if (p == NULL)
return NULL;
return true;
}
Status Listlnsert(LinkList& L, int i, Elemtype e)
{//插入(把元素e插到第i个位置结点上)
auto p = L; int j = 0;
while (p && j < i - 1)
{
p = p->next; ++j;
}
if (!p || j > i - 1)
return false;
auto s = new Lnode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}//Listlnsert_L
Status 删除(LinkList& L, int i)
{
LinkList p = L, s; int j = 1;
while (p && j < i - 1)
{
p = p->next;
j++;
}
if (!p || j > i - 1)
return false;
s = p->next;
p->next = s->next;
//auto e = s->data;
delete s;
return true;
}
Status 头插法(LinkList& A, int n)
{
//创建空链表
auto L = new Lnode;
L->next = NULL;//别忘了这句
int i = 1;
while (i <= n)
{
auto p = new Lnode;
cin >> p->data.a;
cin >> p->data.b;
cin >> p->data.c;
p->next = L->next;
L->next = p;
i++;
}
A = L;
return true;
}
Status 尾插法(LinkList& A, int n)
{
auto L = new Lnode;
L->next = NULL;
LinkList r = L;
for (auto i = 1; i <= n; i++)
{
auto p = new Lnode;
cin >> p->data.a;
cin >> p->data.b;
cin >> p->data.c;
p->next = NULL;
r->next = p;//尾插
r = p;
}
A = L;
return true;
}
int main()
{
}
皆様、新年明けましておめでとうございます