线性链表--插入、删除、显示、销毁
题目:建立一个学习成绩的线性链表,然后对其进行插入、删除、显示、最后销毁该线性表
解题:
一、新建一个学生成绩的结构体:
struct Grade_Info //定义一个学生信息的结构体
{int score; //学生信息结构体包括学生的分数(数据域)和指向下一个结点的指针(指针域)struct Grade_Info *next;
};
typedef struct Grade_Info Node; //简化结构体名 为NODE
二、链表创建操作函数:
先创建头结点,并将指针域置为空,将尾指针也指向头结点。每输入一次数据,就新创建一个结点,并将这个结点的数据域初始化为输入的数据,指针域初始化为空。然后再将这个结点插入到尾结点后面,将尾指针指向当前结点。最后返回创建链表的头指针
NODE *Create_LinkList()
{NODE *head,*tail,*pnew; //定义三个结点int score;head=(NODE*)malloc(sizeof(NODE)); //创建头结点if(head==NULL) return; //如果内存空间不够,则头结点创建失败,则返回head->next=NULL; //头结点的指针域置为空tail=head; //开始的时候尾指针指向头结点printf("Input the score of students:\n"); while(1){scanf("%d",&score); //输入成绩if(score<0) break; //成绩为负,表示循环退出,结束输入pnew=(NODE*)malloc(sizeof(NODE)); //没输入一次成绩,就新建一个结点if(pnew==NULL) return; //如果结点为空,则表示分配内存不够,返回pnew->score=score; //新建结点的数据域等于输入的成绩pnew->next=NULL; //新建结点的指针域置为空tail->next=pnew; //新结点插入链表尾部tail=pnew; //尾指针指向当前的尾结点}return(head); //返回创建的链表的头指针
}
三、链表插入操作函数
先找到第i个结点,p结点指向这个结点,如果这个结点为空,则表示不存在,返回
将要插入的这个结点指向p的后继结点,将p的指针域指向插入结点
void Insert_LinkList(NODE *head,NODE *pnew,int i) //将pnew所指向的结点插入到以head为头指针的链表的第i个结点之后
{NODE *p;int j;for(j=0;j<i&&p!=NULL;j++) //先找到第i个结点p=p->next; //p指向这个结点if(p==NULL) return; //这个结点为空,表示不存在pnew->next=p->next; //要插入的结点指向p的后继结点p->next=pnew; //将p结点的指针域指向插入结点
}
四、链表删除操作函数
先定义一个结点p,确保要删除的不是头结点时,将p指向要删除的结点的前驱节点,然后将q指向要删除的结点,最终用
p->next=q->next;删除第i个结点,并且释放这个结点的内存单元
void Delete_LinkList(Node *head,int i) //删除以head 为头指针的链表的第i个结点
{Node *p,*q;int j;if(i==0) return; //如果i=0,表示要删除的是头结点,头结点无法删除的,所以返回p=head; //将p初始化为头结点for(j=1;j<i&&p->next!=NULL;j++) //将p指向要删除的第i个结点的前驱节点p=p->next; if(p->next==NULL) return; //p结点不存在时,返回q=p->next; //q指向要删除的结点p->next=q->next; //删除第i个结点free(q); //释放第i个结点的内存单元
}
五、链表显示操作函数
定义一个结点p,指向头结点的下一个结点,输出该结点的数据域,并将该结点指向下一个结点,直到该结点为空结点
void Display_LinkList(NODE *head) //输出以head为头结点的数据域的值
{NODE *p; //定义一个结点pfor(p=head->next;p!=NULL;p=p->next) //将p指向头结点的后一个结点,依次往后移动,直到p结点指向空结点printf("%d ",p->score); //输出p结点的数据域printf("\n");
}
六、链表销毁操作函数
先定义一个结点p指向头结点,当头结点的后一个结点不为空时,将q指向p结点的后继节点,p的后继结点又指向q的后继结点,这样就越过了q结点,释放q结点,最后释放头结点
void Free_LinkList(NODE *head) //销毁以head为头结点的单链表
{NODE *p,*q;p=head; //将p指向头结点while(p->next!=NULL) //p的后一个结点不为空时{q=p->next; //q指向p的后一个结点p->next=q->next; //p的后一个结点就指向q的后一个结点,完美的跨过了q结点free(q); //释放q}free(head); //最后释放头结点
}
总的C代码:
#include<stdio.h>
#include<stdlib.h>
struct Grade_Info
{int score;struct Grade_Info *next;
};
typedef struct Grade_Info NODE;
NODE *Create_LinkList();
void Insert_LinkList(NODE *head,NODE *pnew,int i);
void Delete_LinkList(NODE *head,int i);
void Display_LinkList(NODE *head);
void Free_LinkList(NODE *head);
void main()
{NODE *head,*pnew;head=Create_LinkList();if(head==NULL) return;printf("after create:");Display_LinkList(head);printf("\n");pnew=(NODE*)malloc(sizeof(NODE));if(pnew==NULL) return;pnew->score=80;Insert_LinkList(head,pnew,3);printf("after insert:");Display_LinkList(head);printf("\n");Delete_LinkList(head,3);printf("after delete:");Display_LinkList(head);printf("\n");Free_LinkList(head);
}
NODE *Create_LinkList()
{NODE *head,*tail,*pnew;int score;head=(NODE *)malloc(sizeof(NODE));if(head==NULL)return;head->next=NULL;tail=head;printf("Input the score of students:\n");while(1){scanf("%d",&score);if(score<0)break;pnew=(NODE*)malloc(sizeof(NODE));if(pnew==NULL)return;pnew->score=score;pnew->next=NULL;tail->next=pnew;tail=pnew;}return(head);
}
void Insert_LinkList(NODE *head,NODE *pnew,int i)
{NODE *p;int j;p=head;for(j=0;j<i&&p!=NULL;j++)p=p->next;if(p==NULL)return;pnew->next=p->next;p->next=pnew;
}
void Delete_LinkList(NODE *head,int i)
{NODE *p,*q;int j;if(i==0) return;p=head;for(j=1;j<i&&p->next!=NULL;j++)q=p->next;if(p->next==NULL) return;q=p->next;p->next=q->next;free(q);
}
void Display_LinkList(NODE *head)
{NODE *p;for(p=head->next;p!=NULL;p=p->next)printf("%d ",p->score);
}
void Free_LinkList(NODE *head)
{NODE *p,*q;p=head;while(p->next!=NULL){q=p->next;p->next=q->next;free(q);}free(head);
}
运行结果:
线性链表--插入、删除、显示、销毁相关推荐
- 线性表(三)——线性链表(单链表)
线性链表(单链表) 构造原理 用一组地址任意的存储单元(连续的或不连续的)依次存储表中各个数据元素, 数据元素之间的逻辑关系通过指针间接地反映出来. 线性表的这种存储结构称为线性链表,又称为单链表. ...
- 链接列表插入删除方法
链接列表插入方法 (Linked List Insert Methods) Linked List Insert 链表插入 Linked List insert methods allow us to ...
- 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 。 A 单链表 B 静态链表 C 线性链表 D 顺序存储结构
1.需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 . A 单链表 B 静态链表 C 线性链表 D 顺序存储结构 答案:B 2.静态链表中指针表示的是() A 内存地址 B下一元素地 ...
- C++实现线性顺序表的初始化,插入,删除,销毁,清空等功能
C++实现线性顺序表的初始化,插入,删除,销毁,清空等功能 以下代码主要严蔚参考敏主编的<数据结构>(C语言)编写 //线性顺序表 #include <iostream> #d ...
- 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...
的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...
- Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码
SingleLinkedList单向链表插入,删除,查找,修改详解及代码 单向链表学习目标 1. 链表的介绍 2. 单向链表的存储特点以及原理 3. 基本操作:插入,删除等 4. 单向链表应用场景举例 ...
- 《大话数据结构》第3章 线性表 3.8.2 单链表的删除
3.8.2 单链表的删除 现在我们再来看单链表的删除.设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所 ...
- 顺序表和单链表的插入删除操作时间复杂度的区别
顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...
- 颠覆:链表在删除和插入的效率一定优于数组吗?
在大二我们学校的计算机大赛中,出了一道题目:要求证明对于数组和链表进行500次随机访问,比较他们的运行时间.这道题目对于我们程序员来说,可能潜在的答案是链表肯定是快的,但是结果呢? 其实数组在计算机中 ...
- 链表(创建,插入,删除和打印输出
http://www.bianceng.cn/Programming/C/200705/327.htm (以下不全,去此网址看) 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了 ...
最新文章
- Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
- 2021-03-21 jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦),常用的有http,file,ftp等等
- 【TUP第11期】腾讯黄朝兴:浅谈客户端架构
- Spring 多视图配置
- websocket中发生数据丢失_tcp协议;websocket协议;同源策略和跨域
- 编程方法学17:多维数组
- Apache Camel教程– EIP,路由,组件,测试和其他概念的简介
- .net 任务(Task)
- Java 文件路劲获取(流的方式),适用与jar包或war包运行方式
- 喜欢网络文学的人有多少?当代年轻人是这样阅读的
- VNPY价差交易模块
- java默认异常处理_spring boot 默认异常处理的实现
- Spring自动扫描
- 写一个生产者消费者的例子
- Android程序基础开发步骤,以简单的App开发为例
- 常用串口监控软件:Accessport,ComMonitor,Device Monitoring Studio
- 微信小程序之直播功能使用详解
- mongodb的安装和使用
- 最强大脑《智行营救》
- 批量查询网站收录情况的站长工具
热门文章
- html 复制文本 点击复制按钮
- 深度学习-1.3卷积神经网络
- 【广外女生】远程监控软件2008A免费版本
- 怎么做PPT 课件代做 驼峰设计
- 《暗时间》——总结+语录整理
- 说一说协议生成器 - Ricequant米筐量化
- pthread_attr_setinheritsched,pthread_attr_setschedparam函数详解
- RuntimeError: no valid convolution algorithms available in CuDNN
- DCDC与LDO浅析
- MacOS Big Sur 开启 HIDPI