C语言动态链表数据结构

链表的操作增删改查

typedef int DATA;

struct SNode
{
    DATA data;
    SNode* pNext;
};

SNode* g_head=NULL;//全局变量

//从头部添加
void AddHead(DATA nNum)
{
    SNode* p = (SNode*)malloc(sizeof(SNode));//C语言的方式
    //SNode* p = new SNode;//C++ 方式
    p->data = nNum;
    p->pNext = g_pHead;

    g_pHead = p;
}

//从尾部添加
void AddTail(DATA nNum)
{
    SNode* p = (SNode*)malloc(sizeof(SNode));//C语言的方式
    pNew->data = nNum;
    pNew->pNext = NULL;

    if (!g_pHead)
    {
        g_pHead = pNew;
        return;
    }

    SNode* p = g_pHead;
    SNode* p1 = NULL;
    while (p)
    {
        p1 = p;
        p= p->pNext;
    }

    //跳出循环时,p1记录的时最后一个节点,让最后一个节点的pNext指向新创建的节点
    p = p1;
    p->pNext = pNew;

    //另一种写法
    //while(p->pNext != NULL)//循环遍历,当下一个节点为空说明到尾部了
    //    p=p->pNext;
        //p->pNext = pNew;
}

//找到,返回找节点位置;失败返回-1
int FindNodeIndex(DATA nNum)
{
    SNode* p = g_pHead;
    int i =0;
    while(p)
    {
        if (p->data == nNum)
        {
            return i;
        }

        p = p->pNext;
        ++i;
    }

    return -1;
}

//删除成功返回-1;失败返回0
int DeleteNode(DATA nNum)
{
    SNode* p = g_pHead;
    SNode* p1 = NULL;//记录前一个节点

    if (p == NULL)//当前链表为空
    {
        return -1;
    }

    //头节点没有前一个节点,要特殊处理
    if (p->data == nNum)
    {
        g_pHead = p->pNext;
        delete p;
        return 0;
    }
    while(p)
    {
        if (p->data == nNum)
        {
            //删除当前节点时,让当前节点的前一个节点的pNext指向当前节点的后一个节点
            p1->pNext = p->pNext;
            delete p;
            return 0;
        }
        p1= p;//记录前节点
        p = p->pNext;
    }

    return -1;
}

//修改指定节点的值
void ModifyNode(DATA oldNum,DATA newNum)
{
    SNode* p = g_pHead;
    while(p)//
    {
        if (p->data == oldNum)
        {
            p->data = newNum;
        }
            p = p->pNext;
    }
}

//打印所有节点
void PrintALL()
{
    SNode* p = g_pHead;
    if (p == NULL)
    {
        printf("当前链表为空\n");
        return;
    }
    while(p)//
    {
        printf("%d\n",p->data);
        p = p->pNext;
    }
}

//成功返回0;失败返回-1
int FindNode(DATA nNum)
{
    SNode* p = g_pHead;
    while (p)
    {
        if (p->data == nNum)
        {
            return 0;
        }

        p=p->pNext;
    }
    return -1;
}

//在某个节点之后插入新节点;成功返回0;失败返回-1
int InsertNode(DATA npos,DATA nNum)
{
    SNode* pNew = new SNode;//C++ 方式
    pNew->data = nNum;
    pNew->pNext = NULL;

   SNode* p = g_pHead;

    //if (p->data == npos)//头结点
    //{
    //    pNew->pNext=p->pNext;//头节点指向的下一个节点指针放到新节点的pNext
    //    p->pNext=pNew;//头节点pNext指向新节点

    //    return 0;
    //}

    while(p)
    {
        if (p->data == npos)
        {
            pNew->pNext = p->pNext;
            p->pNext=pNew;

            return 0;
        }
            p = p->pNext;
    }

    return -1;
}

void DeleteAll()
{
    SNode* p = g_pHead;
    SNode* p1 = NULL;
    while(p)
    {
        p1=p;
        p= p->pNext;

        delete p1;
    }

    g_pHead = NULL;
}

int main()
{
    DeleteNode(999);//链表为空的时候,删除要加判断

    lAddHead(1);
    lAddHead(2);
    AddHead(3);
    puts("修改前");
    PrintALL();
    ModifyNode(2,-88);
    puts("修改后");
    lPrintALL();

    int i = FindNodeIndex(-88);
    if (i >= 0)
    {
        cout << "第" << i+1 << "个节点找到" <<endl;
    }

    //删除节点
    i = DeleteNode(3);//头部删除要特殊处理
    if (i == 1)
    {
        cout << "删除节点成功!" << endl;
    }
    else
    {
        cout << "删除节点失败!" << endl;
    }
    PrintALL();

    puts("尾部添加");
    AddTail(4);
    PrintALL();

    //修改节点
    ModifyNode(-88,0);
    puts("插入节点3");
    //插入节点
    i = list.InsertNode(4,3);

    list.PrintALL();

    puts("清空链表");
    DeleteAll();
    PrintALL();
  return 0;
}

原文地址:https://www.cnblogs.com/chechen/p/9425524.html

时间: 2024-11-08 02:46:12

C语言动态链表数据结构的相关文章

c语言动态链表的创建

创建动态连链表就是将一个个节点连接起来 (1)动态生成节点 (2)输入节点数据 (3)将节点链在一起 例: typedef struct Data { char num[20]; char name[10]; char sex; float english; float chinese; float math; }; typedef struct Node { struct Data data;//结构体类型//结构体嵌套 struct Node* next;//结构体指针型 }node,*Pn

使用C语言描述静态链表和动态链表

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表. 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html 静态链表 #define _CRT_SECURE_NO_

学习C/C++语言:结构体,动态链表

//*************************************************************** //结构体:简单的静态链表 #include<stdio.h> #include<string.h> #define NULL 0 #define SIZE 10 struct student { char num[SIZE]; float score; struct student *next; }; void main() { struct stu

c语言:写一个函数建立一个有3名学生数据的单向动态链表

写一个函数建立一个有3名学生数据的单向动态链表. 解:程序: #include<stdio.h> #include<stdlib.h> #define LEN sizeof(struct Student) struct Student { long num; float score; struct Student *next; }; int n; struct Student *creat(void)//定义函数返回一个指向链表头的指针 { struct Student *head

[数据结构】【c语言】链表的创建和遍历

第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #include<stdlib.h> #include<malloc.h> //定义链表的节点 typedef struct LNode { int data; struct LNode *next; } *LinkList; //创建链表函数 LinkList CreateList() { Lin

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组.是的,数组就是一种典型的顺序存储数据结构.下面我通过一个实例,来实现对顺序存储结构中的数据增.删.改.查的操作. 首

C语言动态内存管理

1-概述 动态存储管理的基本问题是:系统如何按请求分配内存,如何回收内存再利用.提出请求的用户可能是系统的一个作业,也可能是程序中的一个变量. 空闲块 未曾分配的地址连续的内存区称为"空闲块". 占用块 已分配给用户使用的地址连续的内存区称为"占用块". 系统刚刚启动时,整个内存可看做一个大的"空闲块",随着用户请求的进入,系统依次分配相应的内存. 在系统运行过程中,内存被分为两大部分:低地址区(若干占用块)和高地址区(空闲块). 经过一段时间后

Cocos2d-x 脚本语言Lua基本数据结构-表(table)

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在lua中table很好的实现了这些数据结构.--摘自:<Programming in Lua> 看以下代码,可以很清晰的明白Lua中表的使用: -- Lua中的表,table Config = {hello="Hello Lua",world="World"} -- 赋值方式1,以键=

C语言动态存储分配

动态存储分配 C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串.数组和结构体 本文地址:http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html,转载请注明源地址. 1.内存分配函数 3种内存分配函数都是声明在<stdlib.h>中: malloc函数--分配内存块,但是不对内存块进