数据结构,单链表,球解答

(1)写一算法正向创建含 n 个的结点的单链表 L 。
函数原型语句: void creat _ L ( LinkList & L , int n );
(2)在单链表第 i 个位置插入一结点 s 。
函数原型语句: void ListInsert _ L ( LinkList & L , int i );
(3)要求写一主函数,实现对以上两个函数的调用。
单链表的存储结构如下:
typedef struct LNode {
Elem Type data ;
struct LNode * next ;
} LNode ,* LinkList ;

【以下回答由 GPT 生成】

解决方案

1. 创建单链表

创建单链表的步骤如下:

  1. 定义一个头结点,即一个空结点。
  2. 使用循环依次创建并插入n个结点,每个结点的值由用户输入。插入结点的方法是将每个新创建的结点插入到链表的尾部。
  3. 将链表的头结点指向第一个有效结点。

实现如下:

void create_L(LinkList &L, int n) {
    L = new LNode;  // 创建头结点
    L->next = NULL;  // 初始化链表为空

    LNode *p, *q;
    q = L;

    for (int i = 0; i < n; i++) {
        p = new LNode;  // 创建新结点
        cout << "请输入第 " << i+1 << " 个结点的值:";
        cin >> p->data;  // 输入结点的值

        p->next = NULL;
        q->next = p;  // 将新结点插入到链表的尾部
        q = p;  // 移动q指针到链表尾部
    }
}

2. 在单链表的第i个位置插入一个结点

在单链表的第i个位置插入一个结点的步骤如下:

  1. 判断插入位置i的合法性,即i是否大于等于0且小于等于链表长度加1。
  2. 创建一个新结点s,并输入其值。
  3. 查找链表中第i-1个结点,如果不存在则返回错误信息。
  4. 将新结点s插入到第i-1个结点的之后。

实现如下:

void ListInsert_L(LinkList &L, int i) {
    if (i < 1) {
        cout << "插入位置无效!" << endl;
        return;
    }

    LNode *p = L;
    int j = 0;

    while (p != NULL && j < i-1) {
        p = p->next;  // 查找第i-1个结点
        j++;
    }

    if (p == NULL) {
        cout << "插入位置无效!" << endl;
        return;
    }

    LNode *s = new LNode;
    cout << "请输入要插入的结点的值:";
    cin >> s->data;  // 输入要插入的结点的值

    s->next = p->next;
    p->next = s;
}

3. 主函数调用

主函数调用以上两个函数的操作如下:

  1. 声明一个头指针L,默认为空链表。
  2. 输入用户想要创建的链表长度n。
  3. 调用create_L函数创建链表。
  4. 输入用户想要插入新结点的位置i。
  5. 调用ListInsert_L函数插入新结点。

主函数实现如下:

int main() {
    LinkList L;
    int n, i;

    cout << "请输入要创建的链表长度:";
    cin >> n;

    create_L(L, n);

    cout << "请输入要插入新结点的位置:";
    cin >> i;

    ListInsert_L(L, i);

    return 0;
}

完整代码及运行结果

以上三个函数的完整代码如下所示:

#include<iostream>
using namespace std;

typedef struct LNode {
    int data;
    struct LNode* next;
} LNode, *LinkList;

// 创建单链表
void create_L(LinkList &L, int n) {

    L = new LNode;  // 创建头结点
    L->next = NULL;  // 初始化链表为空

    LNode *p, *q;
    q = L;

    for (int i = 0; i < n; i++) {

        p = new LNode;  // 创建新结点
        cout << "请输入第 " << i+1 << " 个结点的值:";
        cin >> p->data;  // 输入结点的值

        p->next = NULL;
        q->next = p;  // 将新结点插入到链表的尾部
        q = p;  // 移动q指针到链表尾部
    }
}

// 在单链表的第i个位置插入一个结点
void ListInsert_L(LinkList &L, int i) {

    if (i < 1) {
        cout << "插入位置无效!" << endl;
        return;
    }

    LNode *p = L;
    int j = 0;

    while (p != NULL && j < i-1) {
        p = p->next;  // 查找第i-1个结点
        j++;
    }

    if (p == NULL) {
        cout << "插入位置无效!" << endl;
        return;
    }

    LNode *s = new LNode;
    cout << "请输入要插入的结点的值:";
    cin >> s->data;  // 输入要插入的结点的值

    s->next = p->next;
    p->next = s;
}

int main() {
    LinkList L;
    int n, i;

    cout << "请输入要创建的链表长度:";
    cin >> n;

    create_L(L, n);

    cout << "请输入要插入新结点的位置:";
    cin >> i;

    ListInsert_L(L, i);

    return 0;
}

运行结果示例:

请输入要创建的链表长度:3 请输入第 1 个结点的值:1 请输入第 2 个结点的值:2 请输入第 3 个结点的值:3 请输入要插入新结点的位置:2 请输入要插入的结点的值:4

链表的最终结果为:1->4->2->3。

注:以上的代码示例使用的是C++语言进行编写,如果你习惯使用其他编程语言(如Java、Python等),可以根据思路进行相应的调整和实现。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^