链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节点。链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。

#include <stdio.h>//printf()
#include <stdlib.h>//malloc(), free(), system()
#include <string.h>//memset()内存初始化 typedef struct Node *PtrToNode;
struct Node
{
int myData;
PtrToNode nextPtr;
};

注意相应头文件的包含!!!

1、单节点链表的创建

PtrToNode phead = (PtrToNode)malloc(sizeof(struct Node));//申请第一个节点内存空间,phead指向该内存空间
if (phead == NULL)
{
printf("malloc fair\n");
system("pause");
}
memset(phead, 0, sizeof(struct Node));//内存空间清零
phead->myData = 100;
phead->nextPtr = NULL;

2、连续链表的创建

创建连续链表时,主要思想是:每创建一个新节点,就可以为其内部除指针外的其他数据赋值,指针数据暂时不管。当下一个结点创建完毕后,再将之前未赋值的指针指向该结点。

连续列表的创建过程中,需要用到三个指针,分别指向:头节点地址、中间结点地址和尾节点地址,并注意及时更新。

PtrToNode Creat(int num)
{
PtrToNode phead = (PtrToNode)malloc(sizeof(struct Node));//头结点地址
if (phead == NULL)
{
printf("malloc fair\n");
system("pause");
}
PtrToNode p0 = phead;//中间结点地址
PtrToNode p1 = phead;//尾结点地址
memset(phead, 0, sizeof(struct Node));//内存空间清零
phead->myData = 0;
int i = 0;
for (i = 1; i < num; i++)
{
p0 = (PtrToNode)malloc(sizeof(struct Node));
if (p0 == NULL)
{
printf("malloc fair\n");
system("pause");
}
memset(p0, 0, sizeof(struct Node));//内存空间清零
p0->myData = i;//中间结点创建完毕
p1->nextPtr = p0;//将之前尾结点的nextPtr指向新创建的结点地址
p1= p0;//更新尾节点
}
p1->nextPtr = NULL;//将链表尾结点的nextPtr赋值为NULL
return phead;
}

3、指定位置节点的插入

phead为链表首结点地址,num指定插入的位置(本程序链表结点序号从0开始),data是插入节点的数据信息。

PtrToNode Insert(PtrToNode phead, int num, int data)
{
PtrToNode p = phead;
int i = 0;
for(i = 0; i < num - 1; i++)//p指向第num -1个结点的首地址(首结点为第0个结点)
p = p->nextPtr;
PtrToNode pnew = (PtrToNode)malloc(sizeof(struct Node));
PtrToNode pmid = p->nextPtr;//暂时存放p->nextPtr
p->nextPtr = pnew;
pnew->myData = data;
pnew->nextPtr = pmid;
return phead;
}

4、指定位置结点的删除

phead为链表首结点地址,num指定删除的位置(本程序链表结点序号从0开始)。

PtrToNode Delete(PtrToNode phead, int num)
{
PtrToNode p = phead;
int i = 0;
for (i = 0; i < num-1 ; i++)//p指向第num-1个结点的首地址(首结点为第0个结点)
p = p->nextPtr;
PtrToNode pnum = p->nextPtr;
p->nextPtr = pnum->nextPtr;
free(pnum);//注意将删除的结点内存空间释放
return phead;
}

C 单向链表的创建、插入及删除的更多相关文章

  1. C语言习题 链表建立,插入,删除,输出

    Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 222  Solved: 92 [Subm ...

  2. YTU 2430: C语言习题 链表建立,插入,删除,输出

    2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 576  解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...

  3. C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码

    实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...

  4. 笔试算法题(19):判断两条单向链表的公共节点 & 字符集删除函数

    出题:给定两个单向链表的头结点,判断其是否有公共节点并确定第一个公共节点的索引: 分析: 由于是单向链表,所以每个节点有且仅有一个后续节点,所以只可能是Y型交叉(每条链表中的某个节点同时指向一个公共节 ...

  5. C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。

    // //  main.c //  dynamic_link_list // //  Created by ma c on 15/8/5. //  Copyright (c) 2015. All ri ...

  6. C语言双链表遍历,插入,删除

    #include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memse ...

  7. C语言链表总结(创建,排序,增加,删除)

    #include <stdio.h>#include <stdlib.h> typedef struct NODE{ int data ; struct NODE * pNex ...

  8. 单向链表在O(1)时间内删除一个节点

    说删链表节点,第一时间想到就是遍历整个链表,找到删除节点的前驱,改变节点指向,删除节点,但是,这样删除单链表的某一节点,时间复杂度就是O(n),不符合要求: 时间复杂度是O(n)的做法就不说了,看看O ...

  9. DS-4-单链表的各种插入与删除的实现

    typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; 带头结点的按位序插入: //在第i个位置插入元素e bo ...

随机推荐

  1. Django 的认识,面试题

    Django 的认识,面试题 1. 对Django的认识? #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全 ...

  2. 跨域的处理方式 JSONP和CORS和反向代理

    什么是跨域? 首先了解同源策略,三个相同,协议,域名端口号相同就是同源,那么三者有任意不同就会造成跨域.跨域不常见,跨域基本上就是访问别人的资源. 如何解决跨域问题? 常见的有三种 一:jsonp处理 ...

  3. Finance财务软件帮助

    我们在凭证录入的时候可以使用这些快捷键增加效率: 单元格 快捷键 功能 摘要 F7 弹出摘要选择框 科目 F7 弹出科目选择框 科目 F8 弹出扩展字段编辑界面 金额 Esc/小键盘- 清空 金额 = ...

  4. beamer插入图片的一些技巧

    1. 点一下,让另一张隐藏的图出现

  5. STC项目风险分析

    一.引言 由于项目的实现具有不确定性,所以每个项目都是存在风险的. 项目实现过程中的复杂性以及项目内外许多变化的因素,都会造成项目实现过程中的风险. 如果不能对项目的风险进行很好的分析和管理,那么项目 ...

  6. JQUERY-事件-动画-类数组对象-添加自定义API

    正课: 1. 事件: 2. 动画: 3. 类数组对象操作: 4. 添加自定义API: 1. 事件: 1. 页面加载后执行: 2个时机 1. DOM内容加载完成: 仅包括html, js DOMCont ...

  7. 使用dockerfile,创建gitblit镜像

    1. 快速使用gitblit镜像 1.1 push 镜像 # docker pull /gitblit 1.2 查看下载的镜像 # docker images | grep "gitblit ...

  8. ArcSDE

    ArcSDE,即数据通路,是ArcGIS的空间数据引擎,它是在关系数据库管理系统(RDBMS)中存储和管理多用户空间数据库的通路.从空间数据管理的角度看,ArcSDE是一个连续的空间数据模型,借助这一 ...

  9. C语言编程遇到的问题

    1.内存泄漏问题 问题代码1 #include <stdio.h> #include <stdlib.h> int main( int argc, char *argv[] ) ...

  10. (三)Javascript面向对象编程:非构造函数的继承

    Javascript面向对象编程:非构造函数的继承   这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使 ...