c语言完整的链表程序,C语言链表完整操作演示

本文实例为大家分享了C链表操作演示的具体代码,供大家参考,具体内容如下

头文件:link_0505.h

/*

链表演示

*/

#ifndef __LINK_0505

#define __LINK_0505

typedef struct node{

int num;

struct node* p_next;

}node;

typedef struct

{

node head,tail;

}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 );

//在最后边插入新的数字的函数

int link_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 );

#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);

}

//链表的清理函数

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;

free(p_mid);

p_mid = 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;

return 1;

}

//在最后边插入新的数字的函数

int link_append(link *p_link, int num)

{

node *p_tmp = (node *)malloc(sizeof(node));

node *p_node = NULL;

if (!p_tmp)

{

return 0;

}

p_tmp->num = num;

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_first->p_next = p_tmp;

p_tmp->p_next = p_mid;

break;

}

}

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;

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;

free(p_mid);

p_mid = NULL;

}

//删除最后一个有效数字

int link_remove_tail(link *p_link)

{

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_first->p_next = p_last;

free(p_mid);

p_mid = NULL;

return 1;

}

}

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;

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;

}

测试函数:

/*

* 链表测试

* */

#include

#include "link_0505.h"

int main() {

int size = 0, num = 0, val = 0;

link lnk = {0};

link_init(&lnk);

link_add_head(&lnk, 30);

link_add_head(&lnk, 20);

link_append(&lnk, 90);

link_append(&lnk, 100);

link_insert(&lnk, 50);

link_insert(&lnk, 60);

link_insert(&lnk, 40);

link_insert(&lnk, 80);

link_insert(&lnk, 70);

size = link_size(&lnk);

for (num = 0;num <= size - 1;num++) {

link_get(&lnk, &val, num);

printf("%d ", val);

}

printf("\n");

printf("------------------");

link_remove_head(&lnk);

link_remove_tail(&lnk);

link_remove(&lnk, 70);

size = link_size(&lnk);

for (num = 0;num <= size - 1;num++) {

link_get(&lnk, &val, num);

printf("%d ", val);

}

printf("\n");

link_get_head(&lnk, &val);

printf("最前面的数字是%d\n", val);

link_get_tail(&lnk, &val);

printf("最后面的数字是%d\n", val);

link_deinit(&lnk);

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值