내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
목차
(3) 시퀀스 테이블 삽입 및 삭제(정적 할당을 예로 들어)(샘플 코드에는 필요한 기본 기능이 포함되어 있음)
선형 테이블:
(1).그것의 각 요소는,동일한 데이터 유형。
(2).요소들 사이,순서대로。
(3) 모두.헤더 요소그리고꼬리 요소。
(4).머리글과 바닥글을 제외하고 각 요소마다 하나씩 찾을 수 있습니다.직접적인 전구체그리고직계 후계자。
테이블기스로부터
InitList(&L):초기화선형 테이블
DestroyList(&L):파괴하다
。
ListInsert(&L, i, e):끼워 넣다, 테이블 L의 i번째 위치에 요소 e를 삽입합니다.
ListDelete(&L, i, &e):삭제, 테이블 L의 i번째 요소를 삭제하고 e를 사용하여 삭제된 요소를 반환합니다.
。
LocateElem(L, e): 누르기값검색, 테이블에서 특정 키워드 e의 요소 찾기, 아래 첨자가 아닌 e의 순서 반환
GetElem(L, i): 누르기조금테이블의 i번째 요소 값을 검색하여 가져옵니다.
。
기타 일반 작업:
길이(L): 찾기테이블 리더경비
인쇄목록(L):산출테이블모두요소
비어 있음(L): 판정 테이블비어있나요?, true 또는 false를 반환합니다.
판매 생성 및 추가, 삭제, 수정, 확인 등을 고도로 요약한 것입니다.
~에 의해순차적 저장데이터의 선형 테이블
- #define MAX 10
- //顺序表(静态分配)
- class SqList
- {
- public:
- int data[MAX];
- int length;
- };
- //初始化
- void InitList(SqList &l)
- {
- for(int i = 0 ;i < 10 ;i++)
- {
- l.data[i] = 0;
- }
- l.length = 0;
- }
- //打印所有元素
- void PrintList(SqList &l)
- {
- for (int i = 0; i < 10; i++)
- cout << "第" << i << "个数:" << l.data[i] << endl;
- }
-
- //测验
- void test01()
- {
- SqList l;
- InitList(l);
- PrintList(l);
- }
- #define InitSize 10
- //顺序表(动态分配)
- class SqList
- {
- public:
- int* data; //指示动态分配数组的指针
- int MaxSize; //指示最大容量
- int length; //指示当前长度
- };
- //初始化顺序表
- void InitList(SqList& l)
- {
- l.data = new int[InitSize];
- l.MaxSize = InitSize;
- l.length = 0;
- for (int i = 0; i < l.MaxSize; i++)
- {
- l.data[i] = 0;
- }
- }
- //增长数组空间
- void IncreaseSize(SqList& l, int len)
- {
- int* p = l.data; //暂存原数组中的数据
- l.data = new int[10 + len]; //扩展新的数组
- for (int i = 0; i < l.length; i++) //将原数据拷贝进新数组中
- {
- l.data[i] = p[i];
- }
- l.MaxSize = InitSize + len; //修改数组的状态数据
- delete p; //将p释放
- }
- //打印所有元素
- void PrintList(SqList& l)
- {
- for (int i = 0; i < 10; i++)
- cout << "第" << i << "个数:" << l.data[i] << endl;
- }
-
- void test01()
- {
- SqList l;
- InitList(l);
- PrintList(l);
- }
//끼워 넣다
bool ListInsert(SqList&l, int d, int e)
{
if (l.length >= MAX) //먼저 테이블이 꽉 찼는지, 삽입이 적법한지 확인합니다.
{
cout << "삽입에 실패했습니다. 상한선에 도달했습니다." << endl;
거짓을 반환합니다.
}
d < 1 || d > l.length + 1인 경우
{
cout << "삽입에 실패했습니다. 직속 선행자가 없습니다." << endl;
거짓을 반환합니다.
}
for (int j = l.length; j >= d; j--) //삽입 지점 뒤의 요소를 뒤로 이동
l.데이터[j] = l.데이터[j - 1];
l.data[d - 1] = e; //삽입, d는 숫자를 참조하므로 배열 변환 시 1을 빼야 함
l.길이++;
참을 반환합니다.
}//삭제
bool ListDelete(SqList& l, int d, int &e)
{
if (d < 1 || d >l.length) //삭제된 위치가 유효한지 확인
거짓을 반환합니다.
e = l.data[d - 1]; //삭제된 요소를 임시로 저장
for (int j = d; j < l.length; j++) //삭제된 요소 뒤의 요소를 앞으로 이동합니다.
l.data[j - 1] = l.data[j]; //여기서 j = d여야 하며, j-1은 j에 의해 커버되고, j = d-1이면 다음 커버리지는 j가 커버됩니다. j+1이 커버되고 j+1은 결국 어레이의 최대 용량을 초과할 수 있습니다.
l.길이--;
참을 반환합니다.
}
샘플 코드
- #define MAX 10
- //顺序表(静态分配)
- class SqList
- {
- public:
- int data[MAX];
- int length;
- };
- //初始化
- void InitList(SqList& l)
- {
- for (int i = 0; i < 10; i++)
- {
- l.data[i] = 0;
- }
- l.length = 0;
- }
- //打印所有元素
- void PrintList(SqList& l)
- {
- for (int i = 0; i < 10; i++)
- cout << "第" << i << "个数:" << l.data[i] << endl;
- }
- //存入数据
- void InputElem(SqList& l, int e)
- {
- int i = 0;
- while (i < MAX)
- {
- if (l.data[i] == 0)
- {
- l.data[i] = e;
- l.length++;
- break;
- }
- i++;
- }
- }
- //获取顺序表长度
- int GetLength(SqList l)
- {
- //cout << l.length << endl;
- return l.length;
- }
- //插入
- bool ListInsert(SqList& l, int d, int e)
- {
- if (l.length >= MAX) //首先要判断表是否已满、插入是否合法
- {
- cout << "插入失败,已达上限" << endl;
- return false;
- }
-
- if (d < 1 || d > l.length + 1)
- {
- cout << "插入失败,无直接前驱" << endl;
- return false;
- }
- for (int j = l.length; j >= d; j--) //将插入点之后的元素后移
- l.data[j] = l.data[j - 1];
- l.data[d - 1] = e; //插入,因为d指的是第几个数,在数组的换算中要减一
- l.length++;
- return true;
- }
- //删除
- bool ListDelete(SqList& l, int d, int &e)
- {
- if (d < 1 || d >l.length) //判断删除的位置是否合法
- return false;
- e = l.data[d - 1]; //暂存删除掉的元素
- for (int j = d; j < l.length; j++) //将被删除元素之后的元素前移
- l.data[j - 1] = l.data[j]; //此处,必须是j = d,j-1被j覆盖,若j = d-1,则下文的覆盖会变为j 被j+1 覆盖,而j+1在最后有可能会超过数组的最大容量
- l.length--;
- return true;
- }
-
- //查看情况
- void CheckList(SqList& l)
- {
- PrintList(l);
- cout << "当前长度为" << GetLength(l) << endl;
- }
-
- //测验
- void test01()
- {
- SqList l;
- InitList(l);
-
- //输入部分数据
- InputElem(l, 1);
- InputElem(l, 2);
- InputElem(l, 3);
- InputElem(l, 4);
- CheckList(l);
-
- //开始插入
- if(ListInsert(l, 3, 6))
- CheckList(l);
-
- //开始删除
- int a = -1;
- if (ListDelete(l, 2, a))
- CheckList(l);
- }
매우 간단합니다. 자세히 설명할 필요가 없습니다.
- //判断d的合法性
- bool JugdeD(SqList l, int d)
- {
- if (d < 1 || d > l.length)
- return false;
- return true;
- }
-
- //按位序查找
- int GetElem(SqList l, int d)
- {
- if (JugdeD(l, d))
- return l.data[d - 1];
- return 0;
- }
-
- //按值查找
- int LocateElem(SqList l, int e)
- {
- for (int i = 0; i < l.length; i++)
- {
- if (l.data[i] == e) //数组储存的数据,若是类等复杂的数据类型,则需要对等号进行重载
- return i + 1;
- }
- return 0;
- }
- //其余代码与上文相同
- //其中,JugdeD函数可以替换上文插入与删除中对位序合法性的判别————封装
~에 의해체인 스토리지데이터의 선형 테이블
- //单链表
- class LNode
- {
- public:
- int data; //数据域,存放数据
- LNode* next; //指针域,指向下一个节点
- };
- //用using关键字给类起别名,用LinkList指代的是头结点,代表的是整个链表
- using LinkList = LNode*;
-
- //初始化
- bool InitList(LinkList& L)
- {
- L = new LNode();
- if (L == nullptr) //如果成立,则说明内存不足,分配失败
- return false;
- L->next = nullptr;
- return true;
- }
헤드 노드가 없으면 헤드 포인터의 변경에 주의하세요. 다른 모든 것은 동일합니다.
삽입(일반 버전)
- //插入
- bool ListInsert(LinkList& L, int i, int e)
- {
- if (i < 1) //判断插入位点是否合法[1]——i值的合法性
- {
- cout << "i为负数" << endl;
- return false;
- }
- LNode* p = L; //让p与L指向相同的位点,L是指示头指针的,所以L是不能改变的
- LNode* s = new LNode(); //新的数据储存
- s->data = e;
- while (p != nullptr && i != 1) //由头结点起始,开始遍历寻找对应位点
- {
- p = p->next;
- i--;
- }
- if (p == nullptr) //判断插入的位点是否合法[2]——i值对应的节点的合法性
- {
- cout << "插入位点超出实际长度" << endl;
- return false;
- }
- s->next = p->next; //开始接轨,顺序不能乱
- p->next = s;
- return true;
- }
인서트(패키지 버전)
- //特定节点的后插操作
- bool InsertNextNode(LNode* p, int e)
- {
- if (p == nullptr)
- {
- cout << "插入位点超出实际长度" << endl;
- return false;
- }
- LNode* s = new LNode();
- s->data = e;
- s->next = p->next;
- p->next = s;
- return true;
- }
- //插入
- bool ListInsert(LinkList& L, int i, int e)
- {
- if (i < 1) //判断插入位点是否合法[1]——i值的合法性
- {
- cout << "i为负数" << endl;
- return false;
- }
- LNode* p = L; //让p与L指向相同的位点,L是指示头指针的,所以L是不能改变的
- while (p != nullptr && i != 1) //由头结点起始,开始遍历寻找对应位点
- {
- p = p->next;
- i--;
- }
- return InsertNextNode(p, e); //被封装了的部分
- }