`
zjjzmw1
  • 浏览: 1368574 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

链表的增删改查

C 
阅读更多

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

//先定义链表里面的元素。
typedef struct node{
    int data;
    struct node *next;
}MyNode;

//定义整个链表。
typedef struct link{
    MyNode *head;//把head指向的元素定为第一个元素。
}MyLink;


int isEmpty_to_MyLink(MyLink *myLink);//判断链表是否为空。
int push_to_MyLinkInHead(MyLink *myLink,int m);//向链表头添加元素值为m的元素。
int insert_to_MyLink(MyLink *myLink,MyNode *myNode,int m);//向链表的myNode后面添加一个元素值为m的值。
int remove_to_MyLinkByValue(MyLink *myLink,int m);//删除链表中值为m元素。
int length_to_MyLink(MyLink *myLink);//判断链表的长度。
int isExistLoop_MyLink(MyLink *myLink);//判断链表是否有环。
void printMyLink(MyLink *myLink);//输出链表。



int isEmpty_to_MyLink(MyLink *myLink){
    if (myLink->head==NULL) {
        return 1;
    }
    return 0;
}

int push_to_MyLinkInHead(MyLink *myLink,int m){
    MyNode *tempNode=malloc(sizeof(MyNode));
    tempNode->data=m;
    tempNode->next=myLink->head;
    myLink->head=tempNode;
    free(tempNode);
    return 1;
}

int insert_to_MyLink(MyLink *myLink,MyNode *myNode,int m){
    MyNode *tempNode=malloc(sizeof(MyNode));
    tempNode->data=m;
    tempNode->next=myNode->next;
    myNode->next=tempNode;
    free(tempNode);
    return 1;
}

int remove_to_MyLinkByValue(MyLink *myLink,int m){
    if (isEmpty_to_MyLink(myLink)) {
        return 0;
    }
    int flag=0;
    while ((myLink->head)&&(myLink->head->next)) {
        if (myLink->head->next->data==m) {
            myLink->head=myLink->head->next;
            flag++;
        }
    }
    if ((myLink->head)&&(myLink->head->data==m)) {
        myLink->head=myLink->head->next;
        flag++;
    }
    if (flag>0) {
        return 1;
    }
    return 0;
}

int length_to_MyLink(MyLink *myLink){
    int myLength=0;
    while (myLink->head) {
        myLink->head=myLink->head->next;
        myLength++;
    }
   
    return myLength;
}

int isExistLoop_MyLink(MyLink *myLink){
    MyNode *tempNodeA=malloc(sizeof(MyNode));
    MyNode *tempNodeB=malloc(sizeof(MyNode));
    tempNodeA=myLink->head;
    tempNodeB=myLink->head;
    while ((tempNodeB) && (tempNodeB->next)) {
        tempNodeA=tempNodeA->next;
        tempNodeB=tempNodeB->next->next;
        if (tempNodeA==tempNodeB) {
            return 1;
        }
    }
    free(tempNodeA);
    free(tempNodeB);
    return 0;
}

void printMyLink(MyLink *myLink){
    if (isEmpty_to_MyLink(myLink)) {
        printf("链表为空\n");
        return;
    }
    MyNode *myNode = myLink->head;
    while (myNode) {
        printf("%d , ",myNode->data);
        myNode=myNode->next;
    }
}




int main(int argc, const char * argv[])
{

    //创建自己的链表。
    MyLink *myLink = malloc(sizeof(MyLink));
    myLink->head = NULL;
   
    //创建自己链表中的元素。
    MyNode *myNode = malloc(sizeof(MyNode));
    myNode->next=NULL;
    myNode->data=0;
   
    //判断链表是否为空。
    if (isEmpty_to_MyLink(myLink)) {
        printf("空链表\n");
    }
    else{
        printf("不是空链表\n");
    }
    //求得链表的长度。
    printf("链表的长度为 %d\n",length_to_MyLink(myLink));
   
    //向链表中指定位置插入一个元素。
    int temp = 10;

    //插入到链表的头部。
    if (push_to_MyLinkInHead(myLink, temp)) {
        printf("添加成功\n");
    }
    else{
        printf("添加失败\n");
    }
   
    //求得链表的长度。
    printf("链表的长度为 %d\n",length_to_MyLink(myLink));
   
    printMyLink(myLink);
    //删除某个值
    if (remove_to_MyLinkByValue(myLink, temp)) {
        printf("删除成功\n");
    }
    else{
        printf("删除失败\n");
    }
   
    //判断链表是否有环。
    if (isExistLoop_MyLink(myLink)) {
        printf("存在环\n");
    }
    else{
        printf("不存在环\n");
    }
   
    printMyLink(myLink);
   
    //求得链表的长度。
    printf("链表的长度为 %d\n",length_to_MyLink(myLink));
   
   
   
   
   
   
    free(myLink);
    free(myNode);
    return 0;
}

1
0
分享到:
评论

相关推荐

    c++实现链表增删改查

    c++实现链表增删改查

    C/C++链表增删改查排序操作

    使用C++实现双向循环链表的增删改查排序等操作,可查看个人博客的【[数据结构和算法]C/C++双向循环链表实现(增删改查排序)】--链接https://blog.csdn.net/slimmm/article/details/84317806

    java实现链表增删改查

    用java实现链表增删改查

    Java单链表增删改查的实现

    下面我们将详细探讨如何在Java中实现单链表的增、删、改、查功能,以及如何进行选择排序、冒泡排序和反转排序。 1. **单链表的定义**: - 单链表的每个节点通常包括两部分:数据域(存储元素)和指针域(存储下一...

    用c语言实现链表增删改查

    根据提供的文件信息,本文将详细解释如何使用C语言来实现链表的基本操作——增加、删除、修改和查询。这些操作是数据结构学习中的基础部分,对于理解更复杂的数据结构非常有帮助。 ### 一、链表简介 链表是一种...

    双链表增删改查(C语言)

    C语言版本的双链表,有增删改查功能,有注释,并且代码格式规范,容易理解

    链表增删改查

    实现链表的各种功能,增加元素,删除元素,修改元素,查找特定元素。

    双向链表的增删改查

    本文将详细探讨如何实现双向链表的增、删、改、查操作,并通过C++编程语言的DLink.cpp文件进行实际应用。 首先,我们需要定义双向链表的节点结构。一个双向链表节点包含两个指针,分别指向其前一个节点和后一个节点...

    具有增删改查的 循环链表

    创建一个循环链表,该链表可以实现增删改查等功能.....

    有关单向链表的增删改查

    本主题将深入探讨单向链表的增、删、改、查操作。 ### 增加节点 增加节点通常涉及到在链表的特定位置插入新的节点。在单向链表中,插入操作有以下四种常见情况: 1. **头部插入**:在链表的开始处添加新节点。这...

    c语言 单链表的增删改查

    C语言编写的单链表增删改查,实现了单链表的增加,删除,修改,查询等功能

    C语言实例-双向链表增删改查

    【双向链表详解】 双向链表(Doubly Linked List)是计算机科学中的一种基本数据结构,它在单链表的基础上扩展了数据节点的指针结构。与单链表仅包含一个指向下一个节点的指针不同,双向链表的每个节点包含两个指针...

    线性表和链表的存储和增删改查c++

    线性表的增删改查操作 - **插入**:在线性表的指定位置插入一个新元素,需要找到插入点并更新指针。对于链表,这涉及修改前后两个节点的指针。 - **删除**:根据给定的元素或位置删除一个元素,需要找到要删除的...

    链表操作,增删改查.txt

    链表操作,增删改查.txt

    B+ Tree 增删改查 可视化

    通过图形化界面,用户可以直观地看到增删改查操作如何影响树的形态,这对于学习和调试非常有帮助。 ### 应用场景 B+ Tree被广泛应用于数据库索引,如MySQL的InnoDB存储引擎就使用了B+ Tree。文件系统如ext4也采用B+...

    链表实现学生成绩管理_基本的增删改查功能

    本文将深入探讨如何使用C++通过结构体和链表来实现一个简单的学生成绩管理系统,涵盖基本的增删改查功能。 首先,我们需要理解链表的基本概念。链表不同于数组,它不连续存储数据,而是通过节点之间的指针链接。每...

    C语言数据结构库(队列,栈,链表,树的增删改查)

    本资料包提供了一套完整的C语言数据结构库,特别关注于队列、栈、链表和树这四种基本数据结构的增删改查操作。 1. 队列:队列是一种先进先出(FIFO)的数据结构,类似于现实生活中的排队。在这个库中,你可以找到...

    学生成绩管理系统c++链表编写

    c++编写的学生管理系统,采用链表的结构和面向过程的方法,实现了对学生成绩的增删改查的基本功能,具有基本界面,使用者可根据序号选择自己想要实现的功能。

Global site tag (gtag.js) - Google Analytics