头文件:link_0505.h
/*
链表演示
*/
#ifndef __LINK_0505
#define __LINK_0505
typedef struct node{
int num;
struct node* p_next;
struct node *p_pre;
}node;
typedef struct
{
node head,tail;
struct node *p_cur;
}link;
//链表的初始化函数
void link_init(link *);
//链表的清理函数
void link_deinit(link *);
//判断链表是否空的函数
int link_empty(link *);
//判断链表是否满的函数
int link_full(link *);
//统计有效数字个数的函数
int link_size(link *);
//在最前边插入数字的函数
int link_add_head(link *, int );
//在最后边插入新的数字的函数
void append(link *, int );
//把数字按照顺序插入到链表的函数
int link_insert(link *, int);
//删除最前面数字的函数
int link_remove_head(link *);
//删除最后一个有效数字
int link_remove_tail(link *);
//删除某个给定数字的函数
int link_remove(link *, int );
//获得第一个有效数字的函数
int link_get_head(link *, int *);
//获得最后一个有效数字的函数
int link_get_tail(link *, int *);
//获得指定编号数字的函数
int link_get(link *, int *, int );
//开始从前向后遍历
void link_begin(link *);
//获得最后一个数字
int link_next(link *, int *);
//开始从后向前便利的函数
void link_rbegin(link *);
//获得前一个数字的函数
int link_prev(link *, int *);
#endif
link_0505.cpp
/*
链表演示
*/
#include "stdlib.h"
#include "link_0505.h"
//链表的初始化函数
void link_init(link *p_link)
{
p_link->head.p_next = &(p_link->tail);
p_link->tail.p_next = NULL;
p_link->tail.p_pre = &(p_link->head);
p_link->head.p_pre = NULL;
p_link->p_cur = NULL;
}
//链表的清理函数
void link_deinit(link *p_link)
{
while(p_link->head.p_next != &(p_link->tail))
{
node *p_first = &(p_link->head);
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
p_first->p_next = p_last;
p_last->p_pre = p_first;
free(p_mid);
p_mid = NULL;
}
p_link->p_cur = NULL;
}
//判断链表是否空的函数
int link_empty(link *p_link)
{
return p_link->head.p_next == &(p_link->tail);
}
//判断链表是否满的函数
int link_full(link *p_link)
{
return 0;
}
//统计有效数字个数的函数
int link_size(link *p_link)
{
int cnt = 0;
node *p_node = NULL;
for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
{
node *p_first = p_node;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_mid != &(p_link->tail))
{
cnt++;
}
}
return cnt;
}
//在最前边插入数字的函数
int link_add_head(link *p_link, int num)
{
node *p_temp = (node *)malloc(sizeof(node));
if (!p_temp)
{
return 0;
}
p_temp->num = num;
node *p_first = &(p_link->head);
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
p_first->p_next = p_temp;
p_temp->p_next = p_mid;
p_mid->p_pre = p_temp;
p_temp->p_pre = p_first;
return 1;
}
//在最后边插入新的数字的函数
int append(link *p_link, int num)
{
node *p_first = NULL,*p_mid = NULL,*p_last = NULL;
node *p_tmp = (node *)malloc(sizeof(node));
if (!p_tmp)
{
return 0;
}
p_tmp->num = num;
p_tmp->p_pre = NULL;
p_tmp->p_next = NULL;
p_first = p_link->tail.p_pre;
p_mid = p_first->p_next;
p_last = p_mid->p_next;
p_first->p_next = p_tmp;
p_tmp->p_next = p_mid;
p_mid->p_pre = p_tmp;
p_tmp->p_pre = p_first;
return 1;
}
//把数字按照顺序插入到链表的函数
int link_insert(link *p_link, int num)
{
node* p_temp = (node *)malloc(sizeof(node));
node* p_node = NULL;
if (!p_temp)
{
return 0;
}
p_temp->num = num;
p_temp->p_next = NULL;
for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
{
node *p_first = p_node;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_mid == &(p_link->tail) || p_mid->num > p_temp->num)
{
p_first->p_next = p_temp;
p_temp->p_next = p_mid;
p_mid->p_pre = p_temp;
p_temp->p_pre = p_first;
break;
}
}
return 0;
}
//删除最前面数字的函数
int link_remove_head(link *p_link)
{
node *p_first = &(p_link->head);
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_link->head.p_next == &(p_link->tail))
{
return 0;
}
p_first->p_next = p_last;
p_last->p_pre = p_first;
free(p_mid);
p_mid = NULL;
return 0;
}
//删除最后一个有效数字
int link_remove_tail(link *p_link)
{
node *p_first = NULL,*p_mid = NULL,*p_last = NULL;
if (p_link->head.p_next == &(p_link->tail))
{
return 0;
}
p_last = &(p_link->tail);
p_mid = p_last->p_pre;
p_first = p_mid->p_pre;
p_first->p_next = p_last;
p_last->p_pre = p_first;
free(p_mid);
p_mid = NULL;
return 0;
}
//删除某个给定数字的函数
int link_remove(link *p_link, int num)
{
node *p_node = NULL;
for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
{
node *p_first = p_node;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_mid != &(p_link->tail) && p_mid->num == num)
{
p_first->p_next = p_last;
p_last->p_pre = p_first;
free(p_mid);
p_mid = NULL;
return 1;
}
}
return 0;
}
//获得第一个有效数字的函数
int link_get_head(link *p_link, int *p_num)
{
if (p_link->head.p_next == &(p_link->tail))
{
return 0;
}
node *p_first = &(p_link->head);
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
p_first->p_next = p_last;
*p_num = p_mid->num;
return 1;
}
//获得最后一个有效数字的函数
int link_get_tail(link *p_link, int *p_num)
{
node *p_node = NULL;
for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
{
node *p_first = p_node;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_last == &(p_link->tail))
{
*p_num = p_mid->num;
return 1;
}
}
return 0;
}
//获得指定编号数字的函数
int link_get(link *p_link, int *p_num, int num)
{
int cnt = 0;
node *p_node = NULL;
for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next)
{
node *p_first = p_node;
node *p_mid = p_first->p_next;
node *p_last = p_mid->p_next;
if (p_mid != &(p_link->tail) && cnt == num)
{
*p_num = p_mid->num;
return 1;
}
cnt++;
}
return 0;
}
//开始从前向后遍历
void link_begin(link *p_link)
{
p_link->p_cur = &(p_link->head);
}
//获得最后一个数字
int link_next(link *p_link, int *p_num)
{
if (!p_link->p_cur)
{
return 0;
}
p_link->p_cur = p_link->p_cur->p_next;
if (p_link->p_cur == &(p_link->tail))
{
p_link->p_cur = NULL;
return 0;
}
else{
*p_num = p_link->p_cur->num;
return 1;
}
}
//开始从后向前便利的函数
void link_rbegin(link *p_link)
{
p_link->p_cur = &(p_link->tail);
}
//获得前一个数字的函数
int link_prev(link *p_link, int *p_num)
{
if (!p_link->p_cur)
{
return 0;
}
p_link->p_cur = p_link->p_cur->p_pre;
if (p_link->p_cur == &(p_link->head))
{
p_link->p_cur = NULL;
return 0;
}
else{
*p_num = p_link->p_cur->num;
return 1;
}
}
main.cpp
/*
* 链表测试
* */
#include <stdio.h>
#include "link_0505.h"
int main() {
int num;
link lnk = {0};
link_init(&lnk);
append(&lnk,4);
append(&lnk,9);
append(&lnk,14);
append(&lnk,21);
append(&lnk,35);
link_add_head(&lnk,2);
link_insert(&lnk,17);
link_begin(&lnk);
while(link_next(&lnk,&num))
{
printf("%d ",num);
}
printf("\n");
link_remove_head(&lnk);
link_remove_tail(&lnk);
link_remove(&lnk,9);
link_rbegin(&lnk);
while(link_prev(&lnk,&num))
{
printf("%d ", num);
}
printf("\n");
printf("有效数字个数是%d\n",link_size(&lnk));
link_deinit(&lnk);
return 0;
}