链表是数据结构中最基本的线性结构,在编程中使用的频率最高,那么如何用封装思想来编写一个完整的链表操作呢?且看以下代码的实例。
/*功能:演示链表的操作方法 */
/*作者: 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;
}
数据结构——链表的封装