数据结构——链表的封装

链表是数据结构中最基本的线性结构,在编程中使用的频率最高,那么如何用封装思想来编写一个完整的链表操作呢?且看以下代码的实例。

/*功能:演示链表的操作方法 */
             /*作者: james */
             /*时间: 2014.7.16 */
             /*版本: v1.0 */
             /*说明:使用面向对象思想封装一个链表*/

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

/* 定义链式节点结构体 */
             typedef struct _linknode_ {
                     int data; /* 节点的数据域,存放数据 */
                     struct _linknode_ *next; /* 节点的指针域,指向下一个节点 */
             }linknode_t;

/* 定义链表描述结构体,对链表数据、标志位等的封装 */
             typedef struct _linklist_ {
                     struct _linknode_ *head; /* 链表的头指针,指向头节点 */
                     int clen; /* 当前链表的长度 */
                     int tlen; /* 链表的总长度,表明上限 */
             }linklist_t;

/* 创建链式节点 */
             linknode_t *create_linknode(int value);
             /* 初始化链表(创建一个带有头节点的空链表) */
             linklist_t *linklist_init(int len);
             /* 销毁一个链表资源 */
             int linklist_destroy(linklist_t *list);
             /* 插入链表节点(头部插入) */
             int linklist_insert(linklist_t *list, int value);
             /* 打印链表内容 */
             int linklist_show(linklist_t *list);
             /* 根据值删除链表一个节点(如有重复则只删第一个) */
             int linklist_delete(linklist_t *list, int obj);
             /* 修改指定链表节点的值 */
             int linklist_modify(linklist_t *list, int old, int new);

/* 定位链表节点并返回该节点地址 */
             linknode_t *linklist_search(linklist_t *list, int obj);
     
             int main()
             {
                     linklist_t *list = NULL;
                     int value = 100;
                     linknode_t *p = NULL;

list = linklist_init(10);

while (0 == linklist_insert(list, value))
                     value += 100;

linklist_delete(list, 100);

linklist_modify(list, 150, 250);
                     linklist_show(list);

p = linklist_search(list, 2500);
                     if (NULL != p)
                     printf("search: %d\n", p->data);
                     else
                     puts("search: NULL");

linklist_destroy(list);

return 0;
             }

linklist_t *linklist_init(int len)
             {
                     linklist_t *list = NULL;

list = malloc(sizeof(*list));
                     list->head = create_linknode(0);
                     list->clen = 0;
                     list->tlen = len;
     
                     return list;
             }

int linklist_destroy(linklist_t *list)
             {
                     linknode_t *p = list->head;
                     linknode_t *tmp = NULL;

while (NULL != p) {
                             tmp = p;
                             p = p->next;
                             free(tmp);
                     }

free(list);

return 0;
             }

int linklist_insert(linklist_t *list, int value)
             {
                     linknode_t *new = NULL;

if (list->clen >= list->tlen)
                     return -1;

new = create_linknode(value);
                     new->next = list->head->next;
                     list->head->next = new;

list->clen++;
                     return 0;
             }

linknode_t *create_linknode(int value)
             {
                     linknode_t *node = NULL;

node = malloc(sizeof(*node));
                     node->data = value;
                     node->next = NULL;

return node;
             }

int linklist_show(linklist_t *list)
             {
                     linknode_t *p = list->head->next;

while (NULL != p) {
                             printf("%5d", p->data);
                             p = p->next;
                     }
                     putchar(‘\n‘);

return 0;
             }

int linklist_delete(linklist_t *list, int obj)
             {
                     linknode_t *p = list->head;
                     linknode_t *tmp = NULL;

while (NULL != p->next) {
                             if (p->next->data == obj)
                             break;
                             p = p->next;
                     }

if (p->next == NULL)
                     return -1;

tmp = p->next;
                     p->next = tmp->next;
                     free(tmp);

list->clen--;
     
                     return 0;
             }

int linklist_modify(linklist_t *list, int old, int new)
             {
                     linknode_t *p = list->head->next;

while (NULL != p) {
                             if (p->data == old)
                             break;
                             p = p->next;
                     }
                     if (NULL == p)
                     return -1;

p->data = new;

return 0;
             }
     
             linknode_t *linklist_search(linklist_t *list, int obj)
             {
                     linknode_t *p = list->head->next;

while (NULL != p) {
                             if (p->data == obj)
                             return p;
                             p = p->next;
                     }

return NULL;
             }

数据结构——链表的封装

时间: 2024-10-12 17:15:56

数据结构——链表的封装的相关文章

基础数据结构 链表、栈、队列

数据结构是程序设计中一个非常重要的部分,基本的数据结构包括链表.栈和队列,当然高级一点的还有树.图等,实际上链表.栈和队列都是线性表,只是在操作和表示方式上有所不同,线性表用顺序结构表示就是顺序表,用链结构表示就是链表,如果对线性表的操作加以限制,只能有在表尾进行插入和删除元素,这就变成栈了,如果只能允许元素从表尾插入,表头删除,这就变成队列了. 链表 /* * 数据结构 链表 * 链式结构 */ #include <iostream> using namespace std; enum St

数据结构链表学习

今天初步学习数据结构链表,学习过程中感觉对于指针的理解还差很多,而且对于VS的调试也不会使用,调查问题只能靠一遍一遍的梳理逻辑,效率不是一般的低下..接下来得赶紧学习下VS的使用.. 今天链表只是初步学习,写的例子也比较简单,如下: 定义链表的数据结构,只简单的定义了一个数据和一个指向后继的指针 1 struct List { 2 int num; 3 List *next; 4 }; 接下来就是链表的创建,返回一个指针地址赋给主函数中的头指针,用于之后的增删改查等等 1 List *creat

Java数据结构--链表

不懂的先看一下这个百度文库资料http://wenku.baidu.com/link?url=sBTDm0r0or_eLyZPHnsGs5mlnKYKtzuX9FveJ-nguoQcFPM-ZjWauNFP0P2cvh7Qx-UZToPFHMzoGT0mB92rza5LkHT78FMzPIUaKqWKnNC 看懂资料在看一下下面的东西 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).对于每个节点来说,除了存储其本身的信息(数据值

Linux内核数据结构——链表

目录 目录 简介 单向链表 双向链表 环形链表 Linux内核中的链表实现 offsetof container_of container_of 第一部分 container_of 第二部分 链表初始化 向链表中增加一个节点 删除节点 移动节点 判断链表是否为空 遍历链表 Demo测试 mlisth mlistc 执行结果 简介 最近在学习Android Binder驱动程序实现的时候,发现里面的数据结构用到了struct list_head.而我google发现struct list_head

第十章 基本数据结构——链表

 链表 链表与数组的区别是链表中的元素顺序是有各对象中的指针决定的,相邻元素之间在物理内存上不一定相邻.采用链表可以灵活地表示动态集合.链表有单链表和双链表及循环链表.书中着重介绍了双链表的概念及操作,双链表L的每一个元素是一个对象,每个对象包含一个关键字和两个指针:next和prev.链表的操作包括插入一个节点.删除一个节点和查找一个节点,重点来说一下双向链表的插入和删除节点操作,图例如下: 链表是最基本的数据结构,凡是学计算机的必须的掌握的,在面试的时候经常被问到,关于链表的实现,百度一下就

delphi.数据结构.链表

链表作为一种基础的数据结构,用途甚广,估计大家都用过.链表有几种,常用的是:单链表及双链表,还有N链表,本文着重单/双链表,至于N链表...不经常用,没法说出一二三来. 在D里面,可能会用Contnrs.pas.TStack/TQueue相关类,进行操作,不过里面的实现,并非使用的是链表实现,只是用TList,然后...实现的. 呵,TList怎么实现那些不是重点,本文着重是说一下自己使用链表的一些心得. 一:单链表: 单链表的用途,主要一个场景:队列(stack/queue),两者区别在于:s

JavaScript数据结构——链表的实现

前面楼主分别讨论了数据结构栈与队列的实现,当时所用的数据结构都是用的数组来进行实现,但是数组有的时候并不是最佳的数据结构,比如在数组中新增删除元素的时候需要将其他元素进行移动,而在javascript中使用spit()方法不需要访问其他元素.如果你在使用数组的时候发现很慢,就可以考虑使用链表. 链表的概念 链表是一种常见的数据结构.它是动态地进行存储分配的一种结构.链表有一个"头指针"变量,以head表示,它存放一个地址,指向一个元素.每个结点都使用一个对象的引用指标它的后继,指向另一

数据结构 链表基础算法

1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 typedef struct node 5 { 6 int data; 7 struct node * pNext; 8 }NODE,* PNODE; 9 //节点定义 10 //函数声明 11 PNODE create_list(); 12 void traverse_list(PNODE); 13 int len_list(PNODE);

C语言提高之——从结构和指针看数据结构链表

通过组合结构和指针可以创建强大的数据结构.该博客只是针对了单链表来看的. 链表说明: 链表的每一个结点都是一个结构体,其中有两个元素分别是:1.指向下一个结点的指针(link)和该结点数据(value).其中需要一个根指针指向第一个结点(root). 插入数据: 初始代码: 插入的思想是通过比较当前结构的数据和要插入的数据(new_value)大小,从而判断插入位置.首先需要定义两个指针变量,一个指向当前结构(current),一个指向当前结构的前一个结构(previous).当判断好位置之后需