【C语言版】链表的实现

//file :  LinkList.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_

#include<malloc.h>
typedef struct {       //DataType 的定义可以根据实际开发需求更改
    char name[31];
    char number[41];
    double score;

}DataType;

typedef struct node{
    DataType data;
    struct node*next;
}Node,*LinkList;

typedef int (*FindFunc)(DataType);       //辅助函数类型(指针)
typedef void (*NormalFunc)(DataType*);   //辅助函数类型(指针)

LinkList InitList(void);
const DataType* GetData(LinkList list,int index);
void SetData(LinkList list,int index,DataType newData);
void Append(LinkList list,DataType newData);
int Insert(LinkList list,int index,DataType newData);
int Delete(LinkList list,int index,DataType *p_deleteData);
void Traverse(LinkList list,NormalFunc func);
int Find(LinkList list,FindFunc func);
int Length(LinkList list);
int Empty(LinkList list);
void Destroy(LinkList list);

#endif
//file : LinkList.cpp

#include"LinkList.h"

//链表使用前, 先初始化链表
//构建头结点 

LinkList InitList(void)
{

    Node*head;

    head = new Node;
    head->next = NULL;

    return head;

}

//获取链表中的下标为index 的数据域元素,返回这个数据的地址 

const DataType* GetData(LinkList list,int index)
{
    Node *p = list->next;
    int i = 0;

    if(index<0) return NULL;     //index为负数 

    while(p!=NULL&&i<index)
    {
        p=p->next;
        ++i;

    }

    if(p==NULL)  return NULL;    //index过大 

    return &(p->data) ;
}

//将链表中下标为index 的结点的数据域设定为data
//注意:没做边界检查
void SetData(LinkList list,int index,DataType newData)
{
    Node*p = list->next; 

    int i=0;

    if(index<0)  return ; 

    while(p!=NULL && i<index)
    {
        p=p->next;
        ++i;
    }
    if(p==NULL)  return ;

    p->data = newData;
}

//追加一个节点到链表的末尾
void Append(LinkList list,DataType newData)
{
    Node*p = list;
    Node*p_newNode;

    while(p->next!=NULL)
    {

        p = p->next;
    }
    p_newNode = new Node;

    p_newNode->data = newData;
    p_newNode->next = NULL;

    p->next = p_newNode;

}

//插入 :在链表中 将newData插入下标为index 的位置,
//返回值: 是否插入成功
int Insert(LinkList list,int index,DataType newData)
{
    Node*p = list;
    int i=0;
    Node*p_newNode;

    if(index<0)  return 0;    //index为负数 

    while(p != NULL && i<index)
    {
        p=p->next;
        ++i;
    }

    if(p==NULL)   //index超出范围
    {
        return 0;  //删除失败
    }

    p_newNode = new Node;
    p_newNode->data = newData;

    p_newNode->next = p->next;
    p->next = p_newNode;

    return 1;

}

//删除节点:删除链表中下标为index 的结点,如果接口使用者需要获取这个
  //被删除的元素,则 传入一个存储的地址,否则传入NULL
//返回值:是否删除成功

int Delete(LinkList list,int index,DataType *p_deleteData)
{
    Node*p = list;
    int i=0;
    Node*t;

    if(index<0)  return 0;

    while(p->next != NULL && i<index)
    {
        p=p->next;
        ++i;
    }

    if(p->next==NULL)   //超出范围
    {
        return 0;
    }

    t= p->next;
    p->next = p->next->next;

    if(p_deleteData!=NULL)  //如果传入的不为空指针,表明用户需要接受删除的那个数据。
    {
        *p_deleteData = t->data;

    } 

    free(t);

    return 1;

}   

void Traverse(LinkList list,NormalFunc func)
{

    Node*p  = list->next;

    while(p!=NULL)
    {
        func(&(p->data));
        p=p->next;
    }

}

//用户自己写FindFunc , 满足某个条件,则func返回true。

int Find(LinkList list,FindFunc func)
{
    Node* p = list->next;
    int index = 0;

    while(p!=NULL)
    {
        if(func(p->data))
           return index;
        p=p->next;
        index++;

    }
    return -1;
} 

//获取链表的数据个数
int Length(LinkList list)
{
    int count = 0;
    Node*p = list->next;

    while(p!=NULL)
    {
        count++;
        p=p->next;    

    }
    return count;
}

//链表是否为空
int Empty(LinkList list)
{
    return list->next == NULL;

}

//销毁链表
void Destroy(LinkList list)
{
    Node*t;
    while(list!=NULL)
    {
        t = list;
        list=list->next;
        free(t);
    }

}

不知道有没有BUG  暂时没发现。(*^__^*)

时间: 2024-11-10 01:25:42

【C语言版】链表的实现的相关文章

人事管理系统 c语言版

int menu(){ printf("请按提示输入完成操作!\n"); printf("1.查询员工信息\n"); printf("2.统计员工数量\n"); printf("3.录入员工信息\n"); printf("4.删除员工信息\n"); printf("5.按id排序所有员工\n"); printf("6.打印所有员工信息\n"); printf(&quo

双向链表(c语言版)

为了得到一个简洁的C语言实现的双向链表,本篇参照数据结构书籍对双向链表的做了一些修改,内容有: 1.合并分离的头文件和实现文件,认识更为直观: 2.修改函数名和变量名,更贴近自身的理解: 3.删除了返回首节点.尾节点等功能更为单一的函数,留下其主干. 实现思路: 1.定义一个双向链表 2.进行初始化工作:调用initList(),构造一个空的双向链表 3.执行增删改查等操作(节点操作) *插入时注意:封装成节点 1 /*双向链表实现代码*/ 2 #include<malloc.h> 3 #in

C语言版flappy bird黑白框游戏

在此记录下本人在大一暑假,2014.6~8这段时间复习C语言,随手编的一个模仿之前很火热的小游戏----flappy bird.代码bug基本被我找光了,如果有哪位兄弟找到其他的就帮我留言下吧,谢谢了! 代码的完美度肯定是不够的,随手编的嘛,找完bug后就没再去想怎样优化它了,毕竟时间有限. 先说下它的设计思路吧,算法方面,基本是纯靠for if 语句加上纯粹的坐标x,y运算实现的,在下面的代码里,将会看到很多阿拉伯数字的加加减减.没有用到链表什么的,当然,我相信,如果用到链表的话,会更简单,代

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

排序算法总结(C语言版)

1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择排序 3.1     直接选择排序 3.2     堆排序 4.    归并排序 4.1     二路归并排序 4.2     自然合并排序 5.    分布排序 5.1     基数排序 1.插入排序 1.1      直接插入排序 将已排好序的部分num[0]~num[i]后的一个元素num[i+1]插入到之前已排好序的

51系列小型操作系统精髓 简单实现8 C语言版待改进

使用keil4  ,代码Code Optimization:0   运行OK 可运行8个任务 Program Size: data=21.0 xdata=0 code=401  (包括2个示例变量,未优化) 任务从中断处切换,在定时时间到后从定时中断中切换回来. 待改进地方 1.手动优化汇编程序 2. 重入问题 3.参数进函数和时中断的保护问题 #include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T

51系列小型操作系统精髓 简单实现11 C语言版优化后说明(有图)

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

51系列小型操作系统精髓 简单实现7 C语言版待改进

#include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C  初始10ms #define MAX_TASKS 2 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节task_stack[][0]L  task_stack[][1]H. unsigned char idata task_tim

2048小游戏(C语言版)

1 #include <climits> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <string> 6 #include <map> 7 #include <vector> 8 #include <cmath> 9 10 11 /* 12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格

基于BP神经网络的简单字符识别算法自小结(C语言版)

本文均属自己阅读源码的点滴总结,转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:[email protected] 写在前面的闲话: 自我感觉自己应该不是一个很擅长学习算法的人,过去的一个月时间里因为需要去接触了BP神经网络.在此之前一直都认为算法界的神经网络.蚁群算法.鲁棒控制什么的都是特别高大上的东西,自己也就听听好了,未曾去触碰与了解过.这次和BP神经网络的邂逅,让我初步掌握到,理解透彻算法的基本原理与公式,转为计算机所能识别的代码流,这应该就是所谓的数学和计