数据结构课程设计报告

专业名称:计算机科学与技术

课程名称:数据结构       

实训题目:整数单链表的表示和实现                           

实训环境:C 语言实现( Dev C++ )                          

实训内容:定义一个数据元素为整数类型的单链表并实现以下功能:

①  创建整数单链表,输入8个数据,并存储在单链表中;

② 遍历并输出单链表中所有数据元素;

③ 按序号查找,返回数据元素的值或地址;

④ 按值查找,返回数据元素的序号或地址;

⑤ 指定位置(序号)插入新的数据元素;

⑥ 删除指定位置(序号)数据元素。

实训小组

学号

姓名

分工

联系电话

小组组长

2xxxxxxx

QSZ

创建整数单链表,输入8个数据,并存储在单链表中;并最后输出整理等

备注:运行截图 自行添加

小组成员

QSZ

遍历并输出单链表中所有数据元素;

备注:运行截图 自行添加

QSZ

按序号查找,返回数据元素的值或地址;

QSZ

按值查找,返回数据元素的序号或地址;

QSZ

指定位置(序号)插入新的数据元素;

QSZ

删除指定位置(序号)数据元素。

1 整数单链表存储结构的表示

【注意】:定义数据结构体,并对每个域的功能给与解释说明

整数单链表存储结构的表示如下所示:

typedef struct node{

    int data;                 //存放元素值的域

    struct node *next;        //指向下一节点的指针域

}Node;

其中,`data`为存放整数元素值的域,`next`为指向下一节点的指针域。对于链表中每个节点,其`data`域存放该节点的整数元素值,`next`指向下一个节点。链表的头节点`head`为指向链表第一个节点的指针。null节点为链表的结束标志,即链表结构中最后一个节点的`next`指针域为NULL。

2 整数单链表基本操作的实现

【注意】:首先描述每个功能模块的算法步骤,其次给出C语言实现代码,最后给出运行截图。

2.1 输入数据,创建整数单链表

  算法步骤:

  1. 定义一个结构体Node,包括数据元素data和指向下一个结点的指针next;
  2. 定义一个函数create_list(),用于创建单链表,函数中定义一个头结点head和一个尾结点tail,初始化为NULL;
  3. 逐个输入数据,创建新结点,将新结点插入到链表尾部;
  4. 返回头结点head。

 

C语言实现代码:

  

#include <stdio.h>

#include <stdlib.h>

typedef struct node{

    int data;

    struct node *next;

}Node;

 

Node *create_list(){

    Node *head, *tail, *pnew;

    head = tail = NULL;

    int i, num;

    for(i=0; i<8; i++){

        printf("请输入第%d个数:", i+1);

        scanf("%d", &num);

        pnew = (Node*)malloc(sizeof(Node)); //为新结点动态申请内存

        if(pnew == NULL){ //内存分配失败

            printf("内存分配失败!");

            exit(1);

        }

        pnew->data = num;

        pnew->next = NULL;

        if(head == NULL){ //链表为空

            head = tail = pnew; //头尾结点都指向新结点

        }

        else{

            tail->next = pnew; //尾结点指向新结点

            tail = pnew; //尾结点更新为新结点

        }

    }

    return head; //返回头结点

}

 

int main(){

  Node *head = create_list();

  return 0;

}

运行截图:

2.2 遍历和输出单链表所有数据元素

2.2.1 非递归遍历和输出

算法步骤:

  1. 定义一个指针p指向链表的头结点;
  2. 使用while循环遍历链表,当p不为NULL时,输出当前节点的数据元素,然后将p指向下一个节点;
  3. 输出完毕后,换行。

C语言实现代码:

void print_list(Node *list){

    Node *p;

    p = list;

    while(p != NULL){

        printf("%d ", p->data);

        p = p->next;

    }

    printf("\n");

}

运行截图:

2.2.2 递归遍历和输出

算法步骤:

  1. 定义递归函数print_list递归遍历输出单链表中所有数据元素。
  2. 递归终止条件为链表为空。
  3. 递归输出当前节点的值,并且传入下一节点进行递归。

C语言实现代码:

void print_list(Node *list){

    if(list == NULL)

        return;

    printf("%d ", list->data);

    print_list(list->next);

    printf("\n");

}

运行截图:

2.3 按序号查找,返回数据元素的值或地址

算法步骤:

  1. 定义一个指向链表开头的指针p,并将其初始化为链表的头节点。
  2. 从头节点开始循环遍历链表,如果当前位置的节点不为空且当前位置的位置小于目标位置index,则将指针p指向下一个节点,同时增加i的值。
  3. 如果i的值等于目标位置index,则返回节点p的地址。
  4. 如果循环结束仍未找到目标节点,则说明该序号不存在,返回空指针。

C语言实现代码:

Node *search_by_index(Node *list, int index){

    Node *p;

    p = list;

    int i = 0;

    while(p != NULL && i < index){

        p = p->next;

        i++;

    }

    return p;

}

运行截图:

2.4 按值查找,返回数据元素的序号或地址

  1. 从头节点开始遍历单链表,找到第一个data域等于给定值的节点。
  2. 返回该节点的地址或序号(从1开始计数)。

C语言实现代码:

Node *search_by_value(Node *list, int value){

    Node *p;

    p = list;

    int i = 1;

    while(p != NULL){

        if(p->data == value)

            return p;

        p = p->next;

        i++;

    }

    return NULL;

}

运行截图:

2.5 指定位置(序号)插入新的数据元素

算法步骤:

  1. 创建一个新结点,存储要插入的数据元素。
  2. 查找要插入位置的前驱结点。
  3. 将新结点的next指针指向前驱结点的next指针所指向的结点。
  4. 将前驱结点的next指针指向新结点。

C语言代码实现:

void insert_by_index(Node *list, int index, int value){

    Node *pnew, *p;

    pnew = (Node*)malloc(sizeof(Node));

    if(pnew == NULL){

        printf("内存分配失败!");

        exit(1);

    }

    p = search_by_index(list, index);

    if(p == NULL){

        printf("位置错误!");

        exit(1);

    }

    pnew->data = value;

    pnew->next = p->next;

    p->next = pnew;

}

运行截图:

2.6 删除指定位置(序号)数据元素

算法步骤:

  1. 找到待删除节点p和其前驱节点pre。
  2. 将pre的next指针指向p的next。
  3. 释放p节点。

C语言实现代码:

void delete_by_index(Node *list, int index){

    Node *p, *pre;

    p = search_by_index(list, index);

    if(p == NULL){

        printf("位置错误!");

        exit(1);

    }

    pre = search_by_index(list, index-1);

    pre->next = p->next;

    free(p);

}

运行截图:

3 拓展思考

如果您操作的是双向链表,针对以下功能请描述您的解决思路。

3.1 双向链表中指定位置插入元素如何实现?

  1. 如果链表为空,直接将要插入的元素作为头结点;
  2. 如果要插入的位置是头结点之前,直接将要插入的元素作为新的头结点,将原头结点的前继指针指向新的头结点;
  3. 如果要插入的位置是尾结点之后,直接将要插入的元素作为新的尾结点,将原尾结点的后继指针指向新的尾结点;
  4. 如果要插入的位置是在链表中部,则需要先找到该位置的前一个节点,然后将要插入的元素的后继指针指向该位置节点,将要插入的元素的前继指针指向该位置前一个节点,将该位置节点的前继指针指向要插入的元素,将该位置前一个节点的后继指针指向要插入的元素。

通过以上步骤即可在双向链表中指定位置插入元素。

3.2 双向链表中删除某个元素如何实现?

  1. 如果链表为空,则直接返回空链表;
  2. 如果要删除的是头结点,则将头指针指向头结点的下一个节点,并将新的头结点的前继指针设置为空;
  3. 如果要删除的是尾结点,则将尾指针指向尾结点的前一个节点,并将新的尾结点的后继指针设置为空;
  4. 如果要删除的节点在链表中部,则需要先找到要删除的节点,将要删除节点前一个节点的后继指针指向要删除节点的后继节点,将要删除节点后一个节点的前继指针指向要删除节点的前继节点。

通过以上步骤即可在双向链表中删除某个元素。需要注意的是,在删除节点后需要释放该节点的内存空间,以避免内存泄漏。(报告结束了)

以下是部分代码-从头开始:

#include <stdio.h>
#include <stdlib.h> typedef struct node{//定义结构体Node
int data;
struct node *next;
}Node; //函数1:创建整数单链表,输入8个数据,并存储在单链表中
Node *create_list(){
Node *head, *tail, *pnew;//头结点、尾节点、新节点
head = tail = NULL;//初始时头结点和尾节点为NULL
int i, num;
for(i=0; i<8; i++){//循环8次,输入8个数据
printf("请输入第%d个数:", i+1);
scanf("%d", &num);
pnew = (Node*)malloc(sizeof(Node));//新建一个节点
if(pnew == NULL){//如果内存分配失败
printf("内存分配失败!");
exit(1);//结束程序
}
pnew->data = num;
pnew->next = NULL;
if(head == NULL){
head = tail = pnew;//如果链表为空,则头节点为pnew,尾节点也为pnew
}
else{
tail->next = pnew;//如果链表不为空,则在尾节点后添加pnew节点
tail = pnew;//更新尾节点
}
}
return head;//返回头结点
}
本人保留知识产权。如需详细信息,请通过公告里面的邮箱联系。

点击查看详细代码

声明:本网站所有代码类模块均为本人原创作品,未经许可不得用于商业用途。

数据结构课程设计报告-C 语言整数单链表的表示和实现的更多相关文章

  1. C++课程设计报告总结

          C++课程设计报告             学院:计算机学院 班级:计科141班 姓名:刘建伟 学号:201400814125 指导老师:王璐 C++课程设计实验报告 学号:2014008 ...

  2. 20155235 王玥 《基于Arm实验箱的接口测试和应用》 课程设计报告

    20155235 王玥 <基于Arm实验箱的接口测试和应用> 课程设计报告 一.设计方案及可行性分析 熟悉 Linux 开发环境 多线程应用程序设计 串行端口程序设计 中断实验 二.详细设 ...

  3. Java实验-课程设计报告一:个人银行账户管理系统SavingAccountManageSystem-具体文档+源码

    课程设计报告一:个人银行账户管理系统 此文档及源码仅供参考 不得直接复制使用 author: [xxxxxxxxx xx xxxx] date: "2019-04-12" 作 者: ...

  4. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  5. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  6. C/C++语言实现单链表(带头结点)

    彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...

  7. C语言实现单链表-02版

    我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...

  8. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  9. C语言实现单链表节点的删除(带头结点)

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

  10. 数据结构课程设计四则运算表达式求值(C语言版)

    本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项:    1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...

随机推荐

  1. centos7.3离线安装和配置NFS

    概述 # NFS为 Network FileSystem 的简称,它的目的就是想让不同的机器.不同的操作系统可以彼此分享个别的档案啦! 目前在 Unix Like 当中用来做为文件服务器是相当不错的一 ...

  2. NVM 使用

    NVM(Node Version Manager)是 Node.js 的版本管理工具. NVM 项目为 macOS 和 Linux 开发.Windows 用户需要使用 NVM for Windows. ...

  3. 【测试平台开发】——01后端web开发框架Flask

    官方中文地址:https://flask.net.cn/ 官方英文地址:https://flask.palletsprojects.com/en/2.1.x/ github地址:https://git ...

  4. Qemu - 介绍

    Ref: QEMU支持3种运行模式 -- 理解 https://www.minitool.com/partition-disk/qemu-for-windows.html

  5. python操作ipv6_用python开启临时http服务器及其ipv6支持

    https://blog.csdn.net/weixin_35647799/article/details/112023159

  6. NFS挂载时出现mount

    NFS挂载时出现"mount.nfs: access denied by server while mounting "的解决方法 1.使用了非法端口,也就是使用了大于1024的端 ...

  7. .NET Core搭配Vue开源弹幕效果,实现一个评论小项目。好玩!

    ZY树洞 前言 ZY树洞是一个基于.NET Core开发的简单的评论系统,主要用于大家分享自己心中的感悟.经验.心得.想法等. 好了,不卖关子了,这个项目其实是上班无聊的时候写的,为什么要写这个项目呢 ...

  8. FastGPT 正式接入 Flux,准备好迎接 AI 绘画的狂风了么?

    Flux 大家最近都听说了吧?它是一款新推出的 AI 绘画模型,拳打 Stable Diffusion 3,脚踢 Midjourney,整个 AI 绘画界都沸腾了. Flux 的主创团队来自由 Sta ...

  9. 小tips:npm与npx的区别

    npm npm是Node.js的软件包管理器,其目标是自动化的依赖性和软件包管理. 这意味着,可以在package.json文件中为项目指定所有依赖项(软件包),当需要为其安装依赖项时,只要运行npm ...

  10. Identity – HTTP Authentication

    前言 HTTP Authentication 是很古老的东西. 已经很少地方会用到了. 但还是给我遇上了. 在做 Google Ads Offline Conversion 时, 它提供了 2 种方式 ...