***************************************************

更多精彩,欢迎进入:http://shop115376623.taobao.com

***************************************************

链表是最简单的一种数据结构,是每个软件开发者必须掌握的,也是企业招聘时最常考的内容,因此,在这里总结一下单链表的一些基本操作。

注:这里是单向无环链表,头结点中存放了数据,换句话说就是头结点和其他结点没什么区别,你也可以说成不带头结点的链表。下面就是链表操作的源代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node *next;
}Lnode;

void printList(Lnode *head);
Lnode *createList();
Lnode *insertList(Lnode *head,int elem,int position);
Lnode *deleteElem(Lnode *head,int elem);
Lnode *reverseList(Lnode *head);

int main()
{
    Lnode *head;
    int elem,position;

head = createList();
    printList(head);

printf("Input the element and the position:/n");
    scanf("%d %d", &elem, &position);
    head = insertList(head,elem,position);
    printList(head);

head = reverseList(head);
    printf("After reversed:/n");
    printList(head);
    
    printf("Input the element you want to delete:/n");
    scanf("%d",&elem);
    head = deleteElem(head, elem);
    printList(head);
    
    return 0;
}

/*传入表头指针,打印链表*/
void printList(Lnode *head)
{
    Lnode *p = head;

if (p == NULL)
    {
        printf("List is empty!/n");
        return;
    }
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("/n");
}

/*创建一个新链表,返回表头指针*/
Lnode *createList()
{
    Lnode *head, *current, *p;
    int data;

head = (Lnode *)malloc(sizeof(Lnode));   
    p = head;

printf("Input integers,0 to break:/n");
    scanf("%d",&data);
    
    if (data != -1)
    {
        p->data = data;
    }
    else
    {
        head->next = NULL;   //只有头结点的情况
        return head;
    }

while (1)
    {
        scanf("%d", &data);
        if (data == -1)
        {
            break;
        }

current = (Lnode *)malloc(sizeof(Lnode));
        current->data = data;
        p->next = current;
        p = p->next;
    }
    p->next = NULL;

return head;
}

/*链表的插入操作,head为链表表头,elem为要插入的元素,position为插入的位置
 *将elem插入至第position个结点后,position<=0时,插入至头结点后
*/
Lnode *insertList(Lnode *head,int elem,int position)
{
    Lnode *current, *p;
    int i = position - 1;
    current = head;

/*找到第position个节点*/
    while (i > 0 && current->next != NULL)
    {
        current = current->next;
        i--;
    }

if (i > 0)   //结点数小于输入的位置position
    {
        printf("Position is wrong!/n");
        return head;
    }

p = (Lnode *)malloc(sizeof(Lnode));
    p->data = elem;
    p->next = current->next;
    current->next = p;
    
    return head;
}

/*删除链表head中所有的元素elem,返回头结点head*/
Lnode *deleteElem(Lnode *head,int elem)
{
    Lnode *p = head;
    Lnode *ptemp;
    int flag = 0;  //记录便表中elem的个数

while (1)
    {
        if (head->data == elem)  //删除头结点的情况
        {
            flag++;
            head = head->next;
            free(p);
            p = head;
        }
        else
        {
            break;
        }
    }

while (p->next != NULL)
    {
        if (p->next->data == elem )
        {
            flag++;
            ptemp = p->next;
            if (p->next->next != NULL)
            {
                p->next = p->next->next;
                free(ptemp);
                ptemp = NULL;
            }
            else //最后一个结点
            {
               free(ptemp);
               ptemp =NULL;
               p->next = NULL;
               break;
            }
        }
        else  //没有删除结点时,查询下一个结点
        {
            p = p->next;
        }
    }
    printf("%d number '%d' was found and deleted./n", flag, elem);
    return head;
}

/*将链表逆序,该链表不带头结点。*/
Lnode *reverseList(Lnode *head)
{
    Lnode *current, *pnext, *ptemp;

current = head;
    pnext = head->next;
    head->next =NULL;

while (pnext != NULL)
    {
        ptemp = pnext->next;
        pnext->next = current;
        current = pnext;
        pnext = ptemp;
    }

head = current;
    return head;
}

学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表相关推荐

  1. 常见算法:C语言中链表的操作(创建,插入,删除,输出)

    链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域.这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值. 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接 一 ...

  2. MySQL 学习笔记(18)— 索引的分类、创建、查看、删除等

    1. 索引类型 1.1 唯一索引与非唯一索引 唯一索引( UNIQUE )中的索引值必须唯一,可以确保被索引的数据不会重复,从而实现数据的唯一性约束. 非唯一索引允许被索引的字段存在重复值,仅仅用于提 ...

  3. nltk和python的关系_NLTK学习笔记(一):语言处理和Python

    目录 nltk资料下载 import nltk nltk.download() 其中,download() 参数默认是all,可以在脚本里面加上nltk.download(需要的资料库) 来进行下载 ...

  4. 在php中表单传值怎么用,PHP学习笔记 01 之表单传值

    一.HTML传值/PHP接收方法 1.GET(地址栏+问号+数据信息) (1)方式一:表单Form: method = 'get' GET接收数据方式: $_GET['表单元素name对应的值] (2 ...

  5. 机器视觉学习笔记(4)——单目摄像机标定参数说明

    机器视觉学习笔记(4)--单目摄像机标定参数说明 标签: 机器视觉 1.针孔摄像机模型 在介绍摄像机标定参数之前,需要先简单说一下针孔摄像机的原理.投影平面到小孔的距离为焦距f,物体到小孔的距离为Z, ...

  6. HTML/CSS学习笔记02【表单标签】

    w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...

  7. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  8. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

  9. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

最新文章

  1. 刻意练习:LeetCode实战 -- Task17. 最长回文子串
  2. MySQL like 通配符是_MySql模糊查询like通配符使用详细介绍
  3. 油管螺纹尺寸对照表_数控加工过程中,如何区分新旧螺纹牌号?
  4. Flask实战2问答平台-父模板抽离(登录注册界面)
  5. kafka 支持发布订阅
  6. Oracle查看并修改最大连接数
  7. @property 参数问题
  8. 基于麻雀算法优化的相关向量机RVM分类算法
  9. nodejs脚本后台运行
  10. Webstorm全版本汉化包
  11. 最新添加了一键加入服务器的功能,功能介绍 - 晴天漫画系统 晴天漫画程序 基于标签的一套自动采集更新漫画系统...
  12. 把“友商”装进芯里威联通运行黑群晖最新DSM系统
  13. C# 添加Excel水印
  14. 用cisco服务器添加html,在接入服务器上配置基本 AAA
  15. javase学习——面向对象(下)
  16. Oracle中joint,Nape中的LineJoint-线段关节
  17. 【Linux】查看linux是centos还是ubuntu的方法
  18. Redis主从连接失败 connected_slaves:0
  19. 关于matches()的使用
  20. 杨振宁六大数理工作赏析 | 祝贺杨先生百岁华诞

热门文章

  1. Windows下多个JDK版本的切换方法
  2. PHP超全局变量$_SERVER
  3. C#曲线分析平台的制作(四,highcharts+ajax加载后台数据)
  4. Struts2的工作原理及工作流程
  5. Elasticsearch的前后台运行与停止(tar包方式)
  6. 【随记】SQL Server连接字符串参数说明
  7. org-mode入门教程
  8. [raywenderlich教程]
  9. Prepare for Mac App Store Submission--为提交到Mac 应用商店做准备
  10. set_error_handler自定义错误处理