IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> PTA 6-5 链式表操作集 (20 分)-链表基础操作 -> 正文阅读

[数据结构与算法]PTA 6-5 链式表操作集 (20 分)-链表基础操作

综述:

? ? ? ? 该题目链表是单向不带头不循环链表,需要实现3个接口,分别是插入、查找、删除三个基础操作,PTA的数据结构基础题感觉练手挺好的。


目录

综述:

题目:

函数接口定义:?

裁判测试程序样例:

输入样例:?

输出样例:?

?函数接口1-查找元素:

查找代码:

函数接口2-插入节点:?

插入代码:

函数接口3-删除节点:?

删除代码:

总结:


题目:

本题要求实现链式表的操作集。

函数接口定义:?

Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );

其中List结构定义如下:

typedef struct LNode *PtrToLNode;
struct LNode {
? ? ElementType Data;
? ? PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;?

各个操作函数的定义为:

?Position Find( List L, ElementType X ):返回线性表中首次出现X的位置。若找不到则返回ERROR;

List Insert( List L, ElementType X, Position P ):将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;

?List Delete( List L, Position P ):将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

#define ERROR NULL
typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );

int main()
{
    List L;
    ElementType X;
    Position P, tmp;
    int N;

    L = NULL;
    scanf("%d", &N);
    while ( N-- ) {
        scanf("%d", &X);
        L = Insert(L, X, L);
        if ( L==ERROR ) printf("Wrong Answer\n");
    }
    scanf("%d", &N);
    while ( N-- ) {
        scanf("%d", &X);
        P = Find(L, X);
        if ( P == ERROR )
            printf("Finding Error: %d is not in.\n", X);
        else {
            L = Delete(L, P);
            printf("%d is found and deleted.\n", X);
            if ( L==ERROR )
                printf("Wrong Answer or Empty List.\n");
        }
    }
    L = Insert(L, X, NULL);
    if ( L==ERROR ) printf("Wrong Answer\n");
    else
        printf("%d is inserted as the last element.\n", X);
    P = (Position)malloc(sizeof(struct LNode));
    tmp = Insert(L, X, P);
    if ( tmp!=ERROR ) printf("Wrong Answer\n");
    tmp = Delete(L, P);
    if ( tmp!=ERROR ) printf("Wrong Answer\n");
    for ( P=L; P; P = P->Next ) printf("%d ", P->Data);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:?

6
12 2 4 87 10 2
4
2 12 87 5

输出样例:?

2 is found and deleted.
12 is found and deleted.
87 is found and deleted.
Finding Error: 5 is not in.
5 is inserted as the last element.
Wrong Position for Insertion
Wrong Position for Deletion
10 4 2 5?


?函数接口1-查找元素:

? ? ? ? 查找元素在链表操作中是最简单的一个接口,从链表的开始L开始遍历,如果找到就返回位置,如果找不到就一直找它的Next,一直到Next指向为空说明这个链表结束,如果Next指向空,该函数也没返回,说明查找的元素不在该链表中。

? ? ? ? 我们可以用一个cur指针遍历这个链表,大致流程如上图所示,具体代码如下:

查找代码:

Position Find(List L, ElementType X)
{
    List cur = L;
    while (cur)
    {
        if (cur->Data == X)
        {
            return cur;
        }
        cur = cur->Next;
    }
    return ERROR;

}

函数接口2-插入节点:?

????????

?

插入代码:

List Insert(List L, ElementType X, Position P)
{
   
    if (L == P)
    {
        List newnode = (List)malloc(sizeof(struct LNode));
        newnode->Data = X;
        newnode->Next = L;
        
        return newnode;
    }

    else
    {
        List cur = L;
        while (cur)
        {
            if (cur->Next == P)
            {
                List newnode = (List)malloc(sizeof(struct LNode));
                newnode->Next = P;
                cur->Next = newnode;
                newnode->Data = X;
                return L;
            }
            cur = cur->Next;
        }
        printf("Wrong Position for Insertion\n");
        return ERROR;
    }
}

函数接口3-删除节点:?

? ? ? ? 删除节点首先要判断一下要删除的节点为空还是不为空,如果是空节点直接返回值,如果节点不为空再进行判断删除。如果只有一个节点,直接返回一个空指针也OK,最好还是要把那一个节点free掉比较好,如果是头删,则free掉L返回L->Next,其他正常情况的删除逻辑如下图:

删除代码:

List Delete(List L, Position P)
{
    if (L == NULL)
    {
        printf("Wrong Position for Deletion\n");
        return ERROR;
    }
    else if (P == L)
    {
        if (P->Next == NULL)
        {
            return NULL;
        }
        else
        {
            List tmp = P->Next;
            free(P);
            P = NULL;
            return tmp;
        }
    }
    else
    {
      List cur = L;

        while (cur)
        {
            if (cur->Next == P)
            {
                List tmp = P->Next;
                free(P);
                P = NULL;
                cur->Next = tmp;
                return L;
            }
            cur = cur->Next;
        }
        printf("Wrong Position for Deletion\n");
        return ERROR;
    }
  


}

总结:

? ? ? ? 单链表无头不循环链表自我感觉比顺序表好写,整个题都是基础的增删查改相关,适合看完课巩固知识练手用。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:38:39  更:2021-08-17 15:38:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 17:22:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计