c语言链表基础,【c基础练习】c语言实现链表

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

typedef struct _LINKNODE{

int data;

struct _LINKNODE* next;

}link_node;

//创建节点

link_node* init_linklist()

{

//创建头结点指针

link_node* head = NULL;

//给头结点分配内存

head = (link_node*)malloc(sizeof(link_node));

if (head == NULL){

return NULL;

}

head->data = -1;

head->next = NULL;

//保存当前节点

link_node* p_current = head;

//向链表中插入节点

int data = -1;

while (1)

{

printf("please input data:\n");

scanf("%d", &data);

//如果输入-1,则退出循环

if (data == -1){

break;

}

//给新节点分配内存

link_node* newnode = (link_node*)malloc(sizeof(link_node));

if (newnode == NULL){

break;

}

//给节点赋值

newnode->data = data;

newnode->next = NULL;

//新节点入链表,也就是将节点插入到最后一个节点的下一个位置

p_current->next = newnode;

//更新辅助指针p_current

p_current = newnode;

}

return head;

}

//遍历链表

void foreach_linklist(link_node* head){

if (head == NULL){

return;

}

//赋值指针变量

link_node* p_current = head->next;

while (p_current != NULL){

printf("%d ", p_current->data);

p_current = p_current->next;

}

printf("\n");

}

//在val插入节点

void insert_linklist(link_node* head, int val, int data){

if (head == NULL){

return;

}

//两个辅助指针

link_node* p_prev = head;

link_node* p_current = p_prev->next;

while (p_current != NULL){

if (p_current->data == val){

break;

}

p_prev = p_current;

p_current = p_prev->next;

}

//如果p_current为NULL,说明不存在值为val的节点

if (p_current == NULL){

printf("不存在值为%d的节点!\n", val);

return;

}

//创建新的节点

link_node* newnode = (link_node*)malloc(sizeof(link_node));

newnode->data = data;

newnode->next = NULL;

//新节点入链表

newnode->next = p_current;

p_prev->next = newnode;

}

//删除值为val的节点

void remove_linklist(link_node* head, int val){

if (head == NULL){

return;

}

//辅助指针

link_node* p_prev = head;

link_node* p_current = p_prev->next;

//查找值为val的节点

while (p_current != NULL){

if (p_current->data == val){

break;

}

p_prev = p_current;

p_current = p_prev->next;

}

//如果p_current为NULL,表示没有找到

if (p_current == NULL){

return;

}

//删除当前节点: 重新建立待删除节点(p_current)的前驱后继节点关系

p_prev->next = p_current->next;

//释放待删除节点的内存

free(p_current);

}

//销毁链表

void destroy_linklist(link_node* head){

if (head == NULL){

return;

}

//赋值指针

link_node* p_current = head;

while (p_current != NULL){

//缓存当前节点下一个节点

link_node* p_next = p_current->next;

free(p_current);

p_current = p_next;

}

}

int main01()

{

link_node* head;

int val = 9;

int data = 3;

int delval = 6;

link_node* init_linklist();

remove_linklist(head, delval);

insert_linklist(head, val, data);

destroy_linklist(head);

system("pause");

return EXIT_SUCCESS;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值