一、链表的建立(头插法和尾插法)

1、头插法:把后建立的结点插在头部。用这种方法建立起来的链表的实际顺序与输入顺序刚好向反,输出时为倒序!
下面附上代码:

struct node *headcreat()
{struct node *p,*q,*head;head = (struct node*)malloc(sizeof(struct node));p = (struct node*)malloc(sizeof(struct node));p->next = NULL;                       //先让最后一个节点p指向空printf("请输入数字,以0结尾:\n");do{q = (struct node*)malloc(sizeof(struct node));scanf("%d",&q->data);if(q->data == 0)break;               //输入数字为0时跳出循环,停止操作(0不在链表内)L++;                                           //L为全局变量,用于计算链表长度,对于实现功能没有影响q->next = p->next;p->next = q;}while(true);head = p;                   //头节点head为空return (head);
}

2、尾插法:将后建立的结点插在链表尾部,这种方法建立起来的链表的实际顺序与输入顺序相同,在对链表顺序有严格要求时,建议使用尾插法!
代码如下:

在这里插入代码片struct node *tailcreat()
{struct node *p,*q,*head;int n = 0;head = (struct node*)malloc(sizeof(struct node));p = (struct node*)malloc(sizeof(struct node));printf("请输入数字,以0结尾:\n");do{q = (struct node*)malloc(sizeof(struct node));scanf("%d",&q->data);L++;if(q->data == 0)break;if(n == 0)                                    //当输入第一个数字时,将这个节点赋值给头节点的指针域{head->next = q;p->next = q;p = q;n++;}p->next = q;p = q;}while(true); p->next = NULL;                          //容易忽略,后果就是在display时疯狂输出!!return (head);
}

二、链表的输出

这个不用多说啦~代码如下:

void display(struct node *head)
{while(head->next!=NULL)             //此处不能为head!=NULL,因为下面的printf输出的是当前位置的下一个结点的数据,若写成head->NULL,则指针指到NULL前个结点时,(head->next)->data无法输出{printf("%d ",(head->next)->data);head = head->next;}
}

三、链表的插入

由于新建的链表是有头结点的链表,固不必讨论插入的位置是在头部还是在中间或尾部,若没有头结点,则要分为插在头部和插在中间(尾部)两种情况讨论,因为插在头部需要改变head的值,而插在中间或尾部就不用改变head。这也是我建议建立有头指针的链表的原因!
为了便于理解,可以画张图~

代码如下:

struct node *insert(struct node *head)
{struct node *r,*p;int i,j;p = head;r = (struct node*)malloc(sizeof(struct node));printf("请输入你要插入的位置:\n");scanf("%d",&i);printf("请输入你要插入的数字:\n");scanf("%d",&r->data);for(j=1;j<i;j++)                    //将指针移动到要插入新结点的位置p = p->next;r->next = p->next;p->next = r;L++;return(head);
}

四、结点的删除

同样不需要考虑要删除的位置啦~原因同上

struct node *del(struct node *head)
{struct node *p;int i;p = head;printf("请输入你要删除的数字:\n");scanf("%d",&i);while(i!=(p->next)->data)               //当要指针移动到要删除的结点的前一个结点时p = p->next;p->next = (p->next)->next;L--;return(head);
}

以上就是单链表的基本操作我对于链表的j理解还不是很深刻!欢迎指正交流下面附上完整代码:

#include<stdio.h>
#include<stdlib.h>typedef struct node
{int data;struct node *next;
}node;int L;struct node *tailcreat()
{struct node *p,*q,*head;int n = 0;head = (struct node*)malloc(sizeof(struct node));p = (struct node*)malloc(sizeof(struct node));printf("请输入数字,以0结尾:\n");do{q = (struct node*)malloc(sizeof(struct node));scanf("%d",&q->data);L++;if(q->data == 0)break;if(n == 0){head->next = q;p->next = q;p = q;n++;}p->next = q;p = q;}while(true); p->next = NULL;return (head);
}struct node *headcreat()
{struct node *p,*q,*head;head = (struct node*)malloc(sizeof(struct node));p = (struct node*)malloc(sizeof(struct node));p->next = NULL;printf("请输入数字,以0结尾:\n");do{q = (struct node*)malloc(sizeof(struct node));scanf("%d",&q->data);if(q->data == 0)break;L++;q->next = p->next;p->next = q;}while(true);head = p;return (head);
}struct node *insert(struct node *head)
{struct node *r,*p;int i,j;p = head;r = (struct node*)malloc(sizeof(struct node));printf("请输入你要插入的位置:\n");scanf("%d",&i);printf("请输入你要插入的数字:\n");scanf("%d",&r->data);for(j=1;j<i;j++)p = p->next;r->next = p->next;p->next = r;L++;return(head);
}struct node *del(struct node *head)
{struct node *p;int i;p = head;printf("请输入你要删除的数字:\n");scanf("%d",&i);while(i!=(p->next)->data)p = p->next;p->next = (p->next)->next;L--;return(head);
}void display(struct node *head)
{while(head->next!=NULL){printf("%d ",(head->next)->data);head = head->next;}
}int main()
{struct node *head;head = tailcreat();display(head);head = insert(head);display(head);head = del(head);display(head);return 0;
}

单链表的基础操作(头插法、尾插法、插入和删除)相关推荐

  1. c语言 链表建立头插法尾插法,单链表的创建(头插法和尾插法)

    单链表的创建分为头插法和尾插法,头插法是不断地向头结点插入新的结点.这样会使你所插入的结点值呈现逆序,所以头插法也可以实现单链表的逆置.尾插法是不断地向插入的新元素之后再插入新的元素.需要注意的是头插 ...

  2. java实现单链表的建立(头插法和尾插法)

    单链表 单链表(Single Linked List): 单链表是一种链式存取的数据结构,用一组地址任意(可能连续,也可能不连续)的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个 ...

  3. 不带头结点的单链表的创建(头插法和尾插法)

    1.用头插法建立不带头结点的单链表 #include<iostream> using namespace std;//单链表的结构体 typedef struct Node {int da ...

  4. c语言单链表的创建(头插法和尾插法)

    概念: 单链表的建立: 头插法:元素插入在链表的头部,也叫做前插法. 尾插法:元素插入在链表的尾部,也叫做后插法. 头插法: 方法1: 步骤: 1)创建一个空链表(含头结点) 2)再创建一个需要插入的 ...

  5. 单链表的基础操作(带头结点)

    链表(带头结点)的基础操作:(王道书的实现,附带main函数) 1.链表的初始化 2.头插法建立单链表 3.尾插法建立单链表 4.指定结点的前插 5.指定结点的后插 6.按位查询 7.按值查询 8.链 ...

  6. 单链表的头插法尾插法及删除节点操作

    带头节点的单链表的头插法尾插法及删除节点操作 链表的操作对于初学者来说理解非常有难度,初学的同学们应该在学习链表的过程中多再练习本上画图,写一行代码就画出代码执行后链表各节点图的变化,方便理解.我也是 ...

  7. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

    http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...

  8. C语言的单链表创建:头插法/尾插法

    文章目录 前言 链表头插法 链表尾插法 源码实现 前言 接下来一段时间,将对数据结构进行复习,总的来说数据结构自大学之后忘记得有点吓人,为了防止脑容量本就小得脑袋更小,必须得持续性得温故了. 链表数据 ...

  9. 单链表的头插法和尾插法c语言实现

    /*单链表的头插法和尾插法c语言实现*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #d ...

最新文章

  1. 作为一个程序员,数学对你到底有多重要(转)
  2. python常用知识点_Python常用知识点
  3. 【Flutter】Image 组件 ( Image 组件简介 | Image 构造函数 | Image.network 构造函数 | Image.asset 构造函数 )
  4. java命令依赖第三方jar原理_java命令执行带jar包依赖的文件执行不了
  5. 避免关注底层硬件,Nvidia将机器学习与GPU绑定
  6. Spring基于状态机squirrel-foundation简单使用
  7. 学完python基础后该学什么_想提一个老生常谈的问题, Python 基础学完后我应该干啥?...
  8. 作者:李友元(1986-),男,西南财经大学金融创新期刊编辑部助理编辑
  9. MySQL Flow Control Statements(流程控制)
  10. mysql主从配置对解决并发有用_MySQL主从配置,读写分离
  11. 百度面试题:malloc/free 与 new/delete 的区别
  12. 在tomcat下配置jdbc连接池
  13. laravel admin grid文档
  14. php7hugepage,HugePage简介和KVM中使用HugePage
  15. 网易游戏学院系列——书籍《游戏设计》【笔记】
  16. 全面了解 360 评估
  17. 内存取证-Volatility安装使用以及一些CTF比赛题目
  18. java数组相似度_Java 计算两个字符串的相似度
  19. 野火MINI_STM32_CubeMX_SPI1_W25Q64 调试记录
  20. Hashtable使用

热门文章

  1. java8 stream tomap_Java8之Stream流(五)映射流
  2. 基于VTK的MPR实现
  3. Boost 学习之Align-Rationale部分
  4. Learning ROS: Managing System dependencies
  5. 计算机和教师教学的应用,计算机在教学中的应用优势
  6. apk android lite,APK提取器lite
  7. 【Java开发】设计模式 05:适配器模式
  8. spring boot 参数 ENC()加密
  9. c 语言程序复杂,你见过或写过的最复杂的 C 语言程序是?
  10. MySQL学习笔记——课后练习