学习笔记——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语言实现单链表(不带头结点)的基本操作

链表在数据结构和算法中的重要性不言而喻。这里我们要用C来实现链表(单链表)中的基本操作。对于链表的基本概念请参考《数据结构与算法之链表》这篇博客。示例代码上传至 https://github.com/...

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

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

带头结点单链表的基本操作(创建、测长、打印、插入、删除、取值、合并、排序、逆置)

单链表分为带头结点和不带头结点两种,带头结点的单链表操作起来比较简单,以下是代码(创建、测长、打印、插入、删除、取值、合并、排序、逆置) #include #include #include...

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

我在前面几篇博客中《C语言实现链表节点的插入》《C语言实现链表节点的删除》《C实现头插法和尾插法来构建链表》《C语言实现链表的基本操作》实现了链表的很多增删改查操作。这里我们要来实现链表的逆序打印,使...

带头结点单链表基本操作.doc

  • 2013年10月15日 16:34
  • 24KB
  • 下载

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)...

C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表)

http://blog.csdn.net/xiaofeige567/article/details/27484137 C语言实现单链表(带头结点)的基本操作(创建,头插法,尾插法,删除结点,打印链表...

C语言实现双向非循环链表(不带头结点)的基本操作

双向链表也叫双链表,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任何一个节点开始,都可以很方便的访问它的前驱结点和后继节点。别人常常来构造双向循环链表,今天我们特立...

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

基于单链表经常见的面试题——基础篇 基于单链表的面试题——进阶篇什么是无头结点链表??? singlelinkedlist.h头文件#ifndef __SINGLELINKEDLIST_H__ ...

C语言进阶-第18讲:单链表的遍历、创建、插入和删除结点

待写
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
举报原因:
原因补充:

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