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

转载 2013年12月04日 11:03:11

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

更多精彩,欢迎进入: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、链表的基本操作(不带头结点)//**的含义把握不准确,要认真研究练习 #include #include typedef struct list { int data; struc...
  • xiaohuizi2009
  • xiaohuizi2009
  • 2013年03月04日 12:44
  • 5874

C语言实现单链表的逆序打印(带头结点)

我在之前一篇博客《C语言实现单链表(不带头结点)的逆序打印》中详细实现了对一个不带头节点的链表的逆序打印,整体思路也是非常的简单,也就是依次遍历原链表,然后把取出的节点用头插法建立一个新的链表,新链表...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 20:07
  • 3460

单链表实现(C语言版,无头结点)

前言:单链表:它是一种链式储存的线性表,用一组地址任意的储存单元存放线性表的数据元素;称储存单元为一个结点;结点:值域+指针域 链表:二、代码实现(1)结点定义:typedef int DataTy...
  • gogogo_sky
  • gogogo_sky
  • 2017年05月02日 02:42
  • 787

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客《C语言实现单链表(不带头结点)的基本操作》中具体实现了不带头结点的单链表的11种操作:如计算链表长度、初始化、创建链表、清空链表等等。但是在实际使用中,带头结点的单链表往往比不带头结...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月01日 13:40
  • 5518

实现无头结点单链表的基本操作函数

基于单链表经常见的面试题——基础篇 基于单链表的面试题——进阶篇什么是无头结点链表??? singlelinkedlist.h头文件#ifndef __SINGLELINKEDLIST_H__ ...
  • Quinn0918
  • Quinn0918
  • 2017年06月09日 17:29
  • 1051

【面试算法系列】逆序输出一个单链表 - C语言实现

将一个单链表的内容逆序输出,考虑到当一个链表的元素打印之前将该元素的前一个元素打印,运用这个思路可以使用递归来实现该功能,(不过该方法仍然存在,问题,当链表过长会导致栈溢出问题)代码如下: /* ...
  • SolemnKyle
  • SolemnKyle
  • 2015年09月08日 17:13
  • 2337

C语言单链表逆序

生命不息,奋斗不止。又到双十一,别人都在扫货,程序员还在改BUG~~~~~ 先贴上别人讲解的链接:单链表逆序 直接上程序,链表没有注释,只有在逆序的函数加了一下自己的理解。 list.h /*...
  • qq411633267
  • qq411633267
  • 2015年11月11日 12:09
  • 1963

C语言实现单链表逆序与逆序输出实例

这篇文章主要介绍了C语言实现单链表逆序与逆序输出,是数据结构与算法中比较基础的重要内容,有必要加以牢固掌握,需要的朋友可以参考下 单链表的逆序输出分为两种情况,一种是只逆序输出,实际上不逆序;另一种是...
  • win_turn
  • win_turn
  • 2016年02月19日 00:24
  • 4401

单链表的基本操作c语言实现

#include #define false 0 #define ok 1//定义节点的结构 typedef struct node{ int data; struct node *n...
  • gongdileidechouzhu
  • gongdileidechouzhu
  • 2017年02月25日 16:14
  • 818

单链表插入和删除结点c语言的实现

个人学习的一些笔记,如果有误,希望指正
  • mango_haoming
  • mango_haoming
  • 2017年03月10日 11:22
  • 2007
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
举报原因:
原因补充:

(最多只允许输入30个字)