题目:建立一个学习成绩的线性链表,然后对其进行插入删除显示、最后销毁该线性表

解题:

一、新建一个学生成绩的结构体:

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);
}    

运行结果:

线性链表--插入、删除、显示、销毁相关推荐

  1. 线性表(三)——线性链表(单链表)

    线性链表(单链表) 构造原理 用一组地址任意的存储单元(连续的或不连续的)依次存储表中各个数据元素, 数据元素之间的逻辑关系通过指针间接地反映出来. 线性表的这种存储结构称为线性链表,又称为单链表. ...

  2. 链接列表插入删除方法

    链接列表插入方法 (Linked List Insert Methods) Linked List Insert 链表插入 Linked List insert methods allow us to ...

  3. 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 。 A 单链表 B 静态链表 C 线性链表 D 顺序存储结构

    1.需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是 . A 单链表 B 静态链表 C 线性链表 D 顺序存储结构 答案:B 2.静态链表中指针表示的是() A 内存地址 B下一元素地 ...

  4. C++实现线性顺序表的初始化,插入,删除,销毁,清空等功能

    C++实现线性顺序表的初始化,插入,删除,销毁,清空等功能 以下代码主要严蔚参考敏主编的<数据结构>(C语言)编写 //线性顺序表 #include <iostream> #d ...

  5. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  6. Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码

    SingleLinkedList单向链表插入,删除,查找,修改详解及代码 单向链表学习目标 1. 链表的介绍 2. 单向链表的存储特点以及原理 3. 基本操作:插入,删除等 4. 单向链表应用场景举例 ...

  7. 《大话数据结构》第3章 线性表 3.8.2 单链表的删除

    3.8.2 单链表的删除         现在我们再来看单链表的删除.设存储元素ai的结点为q,要实现将结点q删除单链表的操作,其实就是将它的前继结点的指针绕过,指向它的后继结点即可(如图3-8-5所 ...

  8. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  9. 颠覆:链表在删除和插入的效率一定优于数组吗?

    在大二我们学校的计算机大赛中,出了一道题目:要求证明对于数组和链表进行500次随机访问,比较他们的运行时间.这道题目对于我们程序员来说,可能潜在的答案是链表肯定是快的,但是结果呢? 其实数组在计算机中 ...

  10. 链表(创建,插入,删除和打印输出

    http://www.bianceng.cn/Programming/C/200705/327.htm  (以下不全,去此网址看) 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了 ...

最新文章

  1. Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
  2. 2021-03-21 jdk中体统的URL能访问的协议非常有限(当然可以进行扩展,不过很麻烦),常用的有http,file,ftp等等
  3. 【TUP第11期】腾讯黄朝兴:浅谈客户端架构
  4. Spring 多视图配置
  5. websocket中发生数据丢失_tcp协议;websocket协议;同源策略和跨域
  6. 编程方法学17:多维数组
  7. Apache Camel教程– EIP,路由,组件,测试和其他概念的简介
  8. .net 任务(Task)
  9. Java 文件路劲获取(流的方式),适用与jar包或war包运行方式
  10. 喜欢网络文学的人有多少?当代年轻人是这样阅读的
  11. VNPY价差交易模块
  12. java默认异常处理_spring boot 默认异常处理的实现
  13. Spring自动扫描
  14. 写一个生产者消费者的例子
  15. Android程序基础开发步骤,以简单的App开发为例
  16. 常用串口监控软件:Accessport,ComMonitor,Device Monitoring Studio
  17. 微信小程序之直播功能使用详解
  18. mongodb的安装和使用
  19. 最强大脑《智行营救》
  20. 批量查询网站收录情况的站长工具

热门文章

  1. html 复制文本 点击复制按钮
  2. 深度学习-1.3卷积神经网络
  3. 【广外女生】远程监控软件2008A免费版本
  4. 怎么做PPT 课件代做 驼峰设计
  5. 《暗时间》——总结+语录整理
  6. 说一说协议生成器 - Ricequant米筐量化
  7. pthread_attr_setinheritsched,pthread_attr_setschedparam函数详解
  8. RuntimeError: no valid convolution algorithms available in CuDNN
  9. DCDC与LDO浅析
  10. MacOS Big Sur 开启 HIDPI