当前位置: 首页 > news >正文

数据结构练习二习题

第七题:

#include<bits/stdc++.h>
using namespace std;

#define MaxSize 100  // 定义顺序表的最大长度

typedef int ElemType;  // 定义元素类型为int

typedef struct {
    ElemType data[MaxSize];  // 存储数据的数组
    int length;              // 当前顺序表的长度
} SqList;

// 插入函数:在有序顺序表中插入元素x
void charu(SqList *&L, ElemType x) {
    if (L->length >= MaxSize) {  // 检查顺序表是否已满
        cout << "顺序表已满,无法插入!" << endl;
        return;
    }

    int i = 0;
    // 找到插入位置
    while (i < L->length && L->data[i] < x) {
        i++;
    }

    // 将插入位置后的元素后移
    for (int j = L->length - 1; j >= i; j--) {
        L->data[j + 1] = L->data[j];
    }

    // 插入元素x
    L->data[i] = x;
    L->length++;  // 顺序表长度加1
}

int main() {
    SqList *L = new SqList();  // 动态分配顺序表内存
    L->length = 0;             // 初始化顺序表长度为0

    int n;
    cout << "请输入有序表的初始元素个数(不超过" << MaxSize << "):";
    cin >> n;

    if (n > MaxSize) {
        cout << "输入的元素个数超过顺序表最大容量!" << endl;
        return 0;
    }

    cout << "请输入" << n << "个有序的整数:" << endl;
    for (int i = 0; i < n; i++) {
        cin >> L->data[i];
        L->length++;  // 每输入一个元素,顺序表长度加1
    }

    int x;
    cout << "请输入要插入的数值x: ";
    cin >> x;

    // 调用插入函数
    charu(L, x);

    // 输出插入后的顺序表
    cout << "插入后的顺序表: ";
    for (int i = 0; i < L->length; i++) {
        cout << L->data[i] << " ";
    }
    cout << endl;

    delete L;  // 释放动态分配的内存
    return 0;
}

第八题:

#include<bits/stdc++.h>
using namespace std;

#define MaxSize 100  // 定义顺序表的最大长度

typedef int ElemType;  // 定义元素类型为int

typedef struct {
    ElemType data[MaxSize];  // 存储数据的数组
    int length;              // 当前顺序表的长度
} SqList;

// 调序函数:将顺序表中的负数移到前面,非负数移到后面
void tiaoxu(SqList *&L) {
    int i = 0;
    int j = L->length - 1;
    while (i < j) {
        while (L->data[i] < 0) i++;  // 从左往右找到第一个非负数
        while (L->data[j] >= 0) j--; // 从右往左找到第一个负数
        if (i < j) {
            swap(L->data[i], L->data[j]);  // 交换两个元素
        }
    }
}

int main() {
    SqList *L = new SqList();  // 动态分配顺序表内存
    L->length = 0;             // 初始化顺序表长度为0

    int n;
    cout << "请输入顺序表的初始元素个数(不超过" << MaxSize << "):";
    cin >> n;

    if (n > MaxSize) {
        cout << "输入的元素个数超过顺序表最大容量!" << endl;
        return 0;
    }

    cout << "请输入" << n << "个整数:" << endl;
    for (int i = 0; i < n; i++) {
        cin >> L->data[i];
        L->length++;  // 每输入一个元素,顺序表长度加1
    }

    // 调用调序函数
    tiaoxu(L);

    // 输出调序后的顺序表
    cout << "调序后的顺序表: ";
    for (int i = 0; i < L->length; i++) {
        cout << L->data[i] << " ";
    }
    cout << endl;

    delete L;  // 释放动态分配的内存
    return 0;
}

第十一题:

第十二题:

#include <iostream>
using namespace std;

// 定义链表结点结构
typedef int ElemType;  // 定义元素类型为int

typedef struct LinkNode {
    ElemType data;              // 数据域
    struct LinkNode* next;      // 指针域
} LinkNode;

// 创建链表
void CreateList(LinkNode*& L, int n) {
    L = new LinkNode();  // 创建头结点
    L->next = nullptr;   // 初始化为空链表

    LinkNode* tail = L;  // 尾指针,初始指向头结点
    cout << "请输入" << n << "个整数:" << endl;
    for (int i = 0; i < n; i++) {
        LinkNode* newNode = new LinkNode();  // 创建新结点
        cin >> newNode->data;
        newNode->next = nullptr;
        tail->next = newNode;  // 将新结点插入链表尾部
        tail = newNode;        // 更新尾指针
    }
}

// 逆置链表
void Reverse(LinkNode*& L) {
    if (L == nullptr || L->next == nullptr) {
        return;  // 空链表或只有一个结点,无需逆置
    }

    LinkNode* p = L->next;  // 当前结点(从第一个有效结点开始)
    LinkNode* q = nullptr;  // 后继结点
    L->next = nullptr;      // 头结点的指针域置空

    while (p != nullptr) {
        q = p->next;        // 保存后继结点
        p->next = L->next;  // 将当前结点插入到头结点之后
        L->next = p;        // 更新头结点的指针域
        p = q;              // 当前结点后移
    }
}

// 输出链表
void Displist(LinkNode* L) {
    LinkNode* p = L->next;  // 从第一个有效结点开始
    while (p != nullptr) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

// 销毁链表
void DestroyList(LinkNode*& L) {
    LinkNode* p = L;
    while (p != nullptr) {
        LinkNode* temp = p;
        p = p->next;
        delete temp;  // 释放结点内存
    }
    L = nullptr;  // 头指针置空
}

int main() {
    LinkNode* L = nullptr;  // 链表头指针
    int n;
    cout << "请输入链表的初始元素个数:";
    cin >> n;

    if (n <= 0) {
        cout << "输入的元素个数无效!" << endl;
        return 0;
    }

    // 创建链表
    CreateList(L, n);

    // 输出原始链表
    cout << "原始链表: ";
    Displist(L);

    // 逆置链表
    Reverse(L);

    // 输出逆置后的链表
    cout << "逆置后的链表: ";
    Displist(L);

    // 销毁链表
    DestroyList(L);

    return 0;
}

第十三题:

#include <bits/stdc++.h>
using namespace std;
typedef int ElemType;  
typedef struct LinkNode {
    ElemType data;             
    struct LinkNode* next;     
} LinkNode;
// 创建链表
void CreateList(LinkNode*& L, int n) {
    L = new LinkNode();  
    L->next = nullptr;   
    LinkNode* tail = L;  
    cout << "请输入" << n << "个整数:" << endl;
    for (int i = 0; i < n; i++) {
        LinkNode* newNode = new LinkNode(); 
        cin >> newNode->data;
        newNode->next = nullptr;
        tail->next = newNode; 
        tail = newNode;      
    }
}
// 找到链表的中间元素
ElemType zhongjian(LinkNode* L) {
    if (L == nullptr || L->next == nullptr) {
        return -1;  
    }
    LinkNode*p=L->next,*q=p;
    while (p->next!=NULL && p->next->next!=NULL){
        p=p->next->next;
        q=q->next;
    }
    return q->data;  
}
// 输出链表
void Displist(LinkNode* L) {
    LinkNode* p = L->next;  
    while (p != nullptr) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
// 销毁链表
void DestroyList(LinkNode*& L) {
    LinkNode* p = L;
    while (p != nullptr) {
        LinkNode* temp = p;
        p = p->next;
        delete temp;  
    }
    L = nullptr;  
}
int main() {
    LinkNode* L = nullptr; 
    int n;
    cout << "请输入链表的初始元素个数:";
    cin >> n;
    if (n <= 0) {
        cout << "输入的元素个数无效!" << endl;
        return 0;
    }
    CreateList(L, n);
    cout << "原始链表: ";
    Displist(L);
     ElemType mid = zhongjian(L);
    if (mid != -1) {
        cout << "中间位置元素: " << mid << endl;
    } else {
        cout << "链表为空或只有一个元素,无法找到中间位置!" << endl;
    }
    DestroyList(L);
    return 0;
}

第十四题:

#include <bits/stdc++.h>
using namespace std;

typedef int ElemType;  // 定义元素类型为int

typedef struct LinkNode {
    ElemType data;              // 数据域
    struct LinkNode* next;      // 指针域
} LinkNode;

// 创建链表
void CreateList(LinkNode*& L, int n) {
    L = new LinkNode();  // 创建头结点
    L->next = nullptr;   // 初始化为空链表

    LinkNode* tail = L;  // 尾指针,初始指向头结点
    cout << "请输入" << n << "个整数:" << endl;
    for (int i = 0; i < n; i++) {
        LinkNode* newNode = new LinkNode();  // 创建新结点
        cin >> newNode->data;
        newNode->next = nullptr;
        tail->next = newNode;  // 将新结点插入链表尾部
        tail = newNode;        // 更新尾指针
    }
}

// 在第一个最大值结点之前插入值为x的结点
void InsertBeforeMax(LinkNode*& L, ElemType x) {
    if (L == nullptr || L->next == nullptr) {
        cout << "链表为空,无法插入!" << endl;
        return;
    }

    LinkNode* p = L->next;  // 当前结点(从第一个有效结点开始)
    LinkNode* prev = L;     // 前驱结点(初始指向头结点)
    ElemType maxVal = p->data;  // 最大值初始化为第一个结点的值
    LinkNode* maxPrev = L;  // 最大值结点的前驱结点

    // 找到第一个最大值结点及其前驱结点
    while (p != nullptr) {
        if (p->data > maxVal) {
            maxVal = p->data;
            maxPrev = prev;
        }
        prev = p;
        p = p->next;
    }

    // 在最大值结点之前插入新结点
    LinkNode* newNode = new LinkNode();
    newNode->data = x;
    newNode->next = maxPrev->next;
    maxPrev->next = newNode;
}

// 输出链表
void Displist(LinkNode* L) {
    LinkNode* p = L->next;  // 从第一个有效结点开始
    while (p != nullptr) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

// 销毁链表
void DestroyList(LinkNode*& L) {
    LinkNode* p = L;
    while (p != nullptr) {
        LinkNode* temp = p;
        p = p->next;
        delete temp;  // 释放结点内存
    }
    L = nullptr;  // 头指针置空
}

int main() {
    LinkNode* L = nullptr;  // 链表头指针
    int n;
    cout << "请输入链表的初始元素个数:";
    cin >> n;

    if (n <= 0) {
        cout << "输入的元素个数无效!" << endl;
        return 0;
    }

    // 创建链表
    CreateList(L, n);

    // 输出原始链表
    cout << "原始链表: ";
    Displist(L);

    // 插入值为x的结点
    ElemType x;
    cout << "请输入要插入的值x: ";
    cin >> x;
    InsertBeforeMax(L, x);

    // 输出插入后的链表
    cout << "插入后的链表: ";
    Displist(L);

    // 销毁链表
    DestroyList(L);

    return 0;
}

第十七题:

#include <bits/stdc++.h>
using namespace std;

typedef int ElemType;  // 定义元素类型为int

typedef struct LinkNode {
    ElemType data;              // 数据域
    struct LinkNode* next;      // 指针域
} LinkNode;

// 创建链表
void CreateList(LinkNode*& L, int n) {
    L = new LinkNode();  // 创建头结点
    L->next = nullptr;   // 初始化为空链表

    LinkNode* tail = L;  // 尾指针,初始指向头结点
    cout << "请输入" << n << "个整数:" << endl;
    for (int i = 0; i < n; i++) {
        LinkNode* newNode = new LinkNode();  // 创建新结点
        cin >> newNode->data;
        newNode->next = nullptr;
        tail->next = newNode;  // 将新结点插入链表尾部
        tail = newNode;        // 更新尾指针
    }
}

// 合并两个单链表
void Merge(LinkNode* ha, LinkNode* hb, LinkNode*& hc) {
    hc = ha;  // hc 指向 ha 的头结点
    LinkNode* p = ha->next;  // p 指向 ha 的第一个有效结点
    LinkNode* q = hb->next;  // q 指向 hb 的第一个有效结点

    // 找到 ha 的尾结点
    while (p->next != nullptr) {
        p = p->next;
    }

    // 将 hb 的结点连接到 ha 的尾部
    p->next = q;

    // 释放 hb 的头结点
    delete hb;
    hb = nullptr;
}

// 输出链表
void Displist(LinkNode* L) {
    LinkNode* p = L->next;  // 从第一个有效结点开始
    while (p != nullptr) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

// 销毁链表
void DestroyList(LinkNode*& L) {
    LinkNode* p = L;
    while (p != nullptr) {
        LinkNode* temp = p;
        p = p->next;
        delete temp;  // 释放结点内存
    }
    L = nullptr;  // 头指针置空
}

int main() {
    LinkNode* ha = nullptr;  // 链表 ha 的头指针
    LinkNode* hb = nullptr;  // 链表 hb 的头指针
    LinkNode* hc = nullptr;  // 合并后的链表 hc 的头指针

    int n1, n2;
    cout << "请输入链表 ha 的初始元素个数:";
    cin >> n1;
    if (n1 <= 0) {
        cout << "输入的元素个数无效!" << endl;
        return 0;
    }
    CreateList(ha, n1);  // 创建链表 ha

    cout << "请输入链表 hb 的初始元素个数:";
    cin >> n2;
    if (n2 <= 0) {
        cout << "输入的元素个数无效!" << endl;
        return 0;
    }
    CreateList(hb, n2);  // 创建链表 hb

    // 输出原始链表
    cout << "链表 ha: ";
    Displist(ha);
    cout << "链表 hb: ";
    Displist(hb);

    // 合并链表
    Merge(ha, hb, hc);

    // 输出合并后的链表
    cout << "合并后的链表 hc: ";
    Displist(hc);

    // 销毁链表
    DestroyList(hc);

    return 0;
}

第十八题:

#include <bits/stdc++.h>
using namespace std;

typedef int ElemType;  // 定义元素类型为int

// 定义双向链表结点结构
typedef struct DLinkNode {
    ElemType data;              // 数据域
    struct DLinkNode* prev;     // 前驱指针
    struct DLinkNode* next;     // 后继指针
} DLinkNode;

// 创建循环双链表
void CreateList(DLinkNode*& head, int n) {
    head = new DLinkNode();  // 创建头结点
    head->prev = head;       // 头结点的前驱指向自己
    head->next = head;       // 头结点的后继指向自己

    DLinkNode* tail = head;  // 尾指针,初始指向头结点
    cout << "请输入" << n << "个整数:" << endl;
    for (int i = 0; i < n; i++) {
        DLinkNode* newNode = new DLinkNode();  // 创建新结点
        cin >> newNode->data;
        newNode->prev = tail;  // 新结点的前驱指向尾结点
        newNode->next = head;  // 新结点的后继指向头结点
        tail->next = newNode;  // 尾结点的后继指向新结点
        head->prev = newNode;  // 头结点的前驱指向新结点
        tail = newNode;        // 更新尾指针
    }
}

// 插入算法
void Insert(DLinkNode*& ha, DLinkNode*& hb, int i) {
    if (ha == nullptr || hb == nullptr) {
        cout << "链表为空,无法插入!" << endl;
        return;
    }

    DLinkNode* p = ha->next;  // 当前结点(从第一个有效结点开始)
    int count = 1;            // 计数器,用于找到第 i 个结点

    // 找到第 i 个结点
    while (p != ha && count < i) {
        p = p->next;
        count++;
    }

    if (i == 0) {
        // 将 hb 插入到 ha 的前面
        DLinkNode* hbTail = hb->prev;  // hb 的尾结点
        hbTail->next = ha->next;       // hb 的尾结点指向 ha 的第一个有效结点
        ha->next->prev = hbTail;       // ha 的第一个有效结点的前驱指向 hb 的尾结点
        ha->next = hb->next;           // ha 的头结点指向 hb 的第一个有效结点
        hb->next->prev = ha;           // hb 的第一个有效结点的前驱指向 ha 的头结点
    } else if (p != ha) {
        // 将 hb 插入到 ha 的第 i 个结点后面
        DLinkNode* hbTail = hb->prev;  // hb 的尾结点
        hbTail->next = p->next;        // hb 的尾结点指向 p 的后继结点
        p->next->prev = hbTail;        // p 的后继结点的前驱指向 hb 的尾结点
        p->next = hb->next;            // p 的后继指向 hb 的第一个有效结点
        hb->next->prev = p;            // hb 的第一个有效结点的前驱指向 p
    } else {
        // 将 hb 插入到 ha 的后面
        DLinkNode* haTail = ha->prev;  // ha 的尾结点
        haTail->next = hb->next;       // ha 的尾结点指向 hb 的第一个有效结点
        hb->next->prev = haTail;       // hb 的第一个有效结点的前驱指向 ha 的尾结点
        hb->prev->next = ha;           // hb 的尾结点指向 ha 的头结点
        ha->prev = hb->prev;           // ha 的头结点的前驱指向 hb 的尾结点
    }

    // 释放 hb 的头结点
    delete hb;
    hb = nullptr;
}

// 输出循环双链表
void Displist(DLinkNode* head) {
    if (head == nullptr || head->next == head) {
        cout << "链表为空!" << endl;
        return;
    }

    DLinkNode* p = head->next;  // 从第一个有效结点开始
    while (p != head) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

// 销毁循环双链表
void DestroyList(DLinkNode*& head) {
    if (head == nullptr) {
        return;
    }

    DLinkNode* p = head->next;  // 从第一个有效结点开始
    while (p != head) {
        DLinkNode* temp = p;
        p = p->next;
        delete temp;  // 释放结点内存
    }
    delete head;  // 释放头结点
    head = nullptr;
}

int main() {
    DLinkNode* ha = nullptr;  // 链表 ha 的头指针
    DLinkNode* hb = nullptr;  // 链表 hb 的头指针

    int n1, n2;
    cout << "请输入链表 ha 的初始元素个数:";
    cin >> n1;
    if (n1 <= 0) {
        cout << "输入的元素个数无效!" << endl;
        return 0;
    }
    CreateList(ha, n1);  // 创建链表 ha

    cout << "请输入链表 hb 的初始元素个数:";
    cin >> n2;
    if (n2 <= 0) {
        cout << "输入的元素个数无效!" << endl;
        return 0;
    }
    CreateList(hb, n2);  // 创建链表 hb

    // 输出原始链表
    cout << "链表 ha: ";
    Displist(ha);
    cout << "链表 hb: ";
    Displist(hb);

    int i;
    cout << "请输入插入位置 i: ";
    cin >> i;

    // 插入链表 hb
    Insert(ha, hb, i);

    // 输出插入后的链表
    cout << "插入后的链表 ha: ";
    Displist(ha);

    // 销毁链表
    DestroyList(ha);

    return 0;
}

实验题2实验5

#include "cdlinklist.cpp"
int main() {
	DLinkNode *h;
	ElemType e;
	cout<<"双链表的基本运算如下:"<<endl;
	cout<<"(1)初始化单链表h"<<endl;
	InitList(h);
	cout<<"(2)依次采用尾插法插入a,b,c,d,e元素"<<endl;
	ListInsert(h,1,'a');
	ListInsert(h,2,'b');
	ListInsert(h,3,'c');
	ListInsert(h,4,'d');
	ListInsert(h,5,'e');
	cout<<"(3)输出双链表h:";
	DisList(h);
	printf("(4)双链表h长度:%d\n",ListLength(h));
	printf("(5)双链表h为%s\n",(ListEmpty(h))?"空":"非空");
	GetElem(h,3,e);
	printf("(6)双链表h的第3个元素:%c\n",e);
	printf("(7)元素a的位置:%d\n",LocateElem(h,'a'));
	printf("(8)在第4个元素位置上插入f元素\n");
	ListInsert(h,4,'f');
	cout<<"(9)输出双链表h:";
	ListInsert(h);
	cout<<"(10)删除h的第3个元素\n";
	ListDelete(h,3,e);
	cout<<"(11)输出双链表h:";
	DisList(h);
	cout<<"(12)释放双链表h:\n";
	DestroyList(h);
	return 1;
}

实验6

#include <iostream>
using namespace std;

typedef struct LinkNode {
    int data;
    struct LinkNode* next;
} LinkNode;

// 创建单链表
void CreateList(LinkNode*& L, int a[], int n) {
    L = new LinkNode();  // 头结点
    L->next = nullptr;
    LinkNode* tail = L;
    for (int i = 0; i < n; i++) {
        LinkNode* newNode = new LinkNode();
        newNode->data = a[i];
        newNode->next = nullptr;
        tail->next = newNode;
        tail = newNode;
    }
}

// 按基准值x划分单链表
void Partition(LinkNode*& L, int x) {
    if (L->next == nullptr || L->next->next == nullptr) return;

    LinkNode* lessHead = new LinkNode();  // 小于x的链表头
    LinkNode* greaterHead = new LinkNode();  // 大于等于x的链表头
    LinkNode* lessTail = lessHead, *greaterTail = greaterHead;
    LinkNode* p = L->next;

    while (p != nullptr) {
        if (p->data < x) {
            lessTail->next = p;
            lessTail = p;
        } else {
            greaterTail->next = p;
            greaterTail = p;
        }
        p = p->next;
    }

    // 合并两个链表
    lessTail->next = greaterHead->next;
    greaterTail->next = nullptr;
    L->next = lessHead->next;

    // 释放临时头结点
    delete lessHead;
    delete greaterHead;
}

// 输出链表
void Displist(LinkNode* L) {
    LinkNode* p = L->next;
    while (p != nullptr) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

// 销毁链表
void DestroyList(LinkNode*& L) {
    LinkNode* p = L;
    while (p != nullptr) {
        LinkNode* temp = p;
        p = p->next;
        delete temp;
    }
    L = nullptr;
}

int main() {
    LinkNode* L;
    int a[] = {3, 5, 8, 5, 10, 2, 1};
    int n = sizeof(a) / sizeof(a[0]);
    int x = 5;  // 基准值

    CreateList(L, a, n);
    cout << "原始链表: ";
    Displist(L);

    Partition(L, x);
    cout << "划分后链表: ";
    Displist(L);

    DestroyList(L);
    return 0;
}

相关文章:

  • qt QOffscreenSurface详解
  • LORA学习笔记
  • 在 .NET 9 中使用 QUIC 实现高效通信:从基础到实战
  • 人工智能-群晖Docker部署DB-GPT
  • failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析
  • 浅谈 Vue3 中的设计模式
  • Spring AI实战初体验——实现可切换模型AI聊天助手
  • 盛铂科技SPP5006/18/40G峰值脉冲功率计探头 国产功率计
  • 【开源宝藏】30天学会CSS - DAY9 第九课 牛顿摆动量守恒动画
  • 网站服务器常见的CC攻击防御秘籍!
  • C语言---函数指针 (指向函数的指针)
  • LeetCode 第29题、30题
  • c++手撕协程库,实现生成器与自定义可等待对象
  • MySQL作业二
  • 如何调整yarn.nodemanager.vmem-pmem-ratio参数?
  • Flutter深度解析:跨平台框架的架构设计与工程实践
  • 日语Learn,英语再认识(4)
  • 创维CW代工-通刷-晶晨S905L3/L3B-安卓9-线刷固件包及教程
  • 多模态大模型的基础模块
  • ROS2 架构梳理汇总整理
  • h5做网站/宁波网络推广运营公司电话
  • 建设网站的功能及目的是什么意思/企业培训
  • 网站模板制作与安装教程/一个完整的产品运营方案
  • 建设人才库网站/广州市新闻最新消息
  • 个人主页自助建站/广告投放平台系统
  • 网站建设合作协议/亚马逊seo推广