ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

循环链表 插入 删除 C/C++

2022-05-19 03:00:07  阅读:142  来源: 互联网

标签:Node node current C++ next 链表 插入 Link data


#include<iostream>

using namespace std;

typedef struct Link_Node{
int data;
Link_Node* next;
} ;


// 循环列表的插入操作,插入到第K个元素后面,link_list 是链表的头结点指针
int insert_data(Link_Node *link_list,int k,int data)
{

if(k<0)  return -1; // 输入的k 不合法。

Link_Node *p_node = link_list;
// 如果是空循环列表,标记为空
int is_empty =0;
if(p_node==p_node->next){
if(k!=0) return -1; // 空循环列表,只能插入第一个位置的元素
is_empty = 1;
}

int i = 0;
while(i<k){
i++;
p_node = p_node->next;

if(p_node==link_list) break; // 插入位置超过链表大小,链表循环到了首节点。
}
if(!is_empty&&p_node==link_list) return -1; // 插入位置不合法,插入失败

// 已经到了第k个元素,把新值放在第K个值后面。
//p_node 是第K个节点,将data放在 p_node 之后。
Link_Node *next_k_node = (Link_Node*)malloc(sizeof(Link_Node));
next_k_node->next = p_node->next;
next_k_node->data = data;
p_node->next = next_k_node;
return 0;

}

int delete_data(Link_Node *link_list,int k)
{
if(k<=0) return -1;

Link_Node *p_node = link_list;

//判断是否为空链表
int is_empty =0;
if(p_node==p_node->next){
if(k!=0) return -1; // 空循环列表,只能插入第一个位置的元素
is_empty = 1;
}
int i = 0;
// 迭代到要删除元素的前一个元素
while(i<k-1){
i++;
p_node = p_node->next;
if(p_node == link_list) break; // 删除的位置超过链表的大小,链表循环到了首节点。
}

//删除第一个元素除外,因为第一个元素的前一个元素为头节点。
if(k>1&&(p_node==link_list||p_node->next==link_list)) return -1; //没有第K个元素,插入位置无效

Link_Node *del_node = p_node->next;
p_node->next = del_node->next;
free(del_node);
return 0;
}


int main(){


Link_Node *p = (Link_Node*)malloc(sizeof(Link_Node)); // 头结点
p->next = p;

insert_data(p,0,20);


Link_Node *current = p;
/*
for(int i = 0 ; i <10 ;i++){
Link_Node *p_node = (Link_Node*)malloc(sizeof(Link_Node));
p_node->data = i;
p_node->next = p;
current->next = p_node;
current = current->next;
}
*/
for(int i = 1;i < 10; i++){
insert_data(p,i,i);
}

insert_data(p,10,10);
insert_data(p,11,11);

current = p;
while(current=current->next){
if(current == p) break;
cout<<"当前节点值:"<<current->data<<"下一个节点值:"<<((current->next) ? to_string(current->next->data):"目前已是尾节点")<<endl;
}
delete_data(p,1);
current = p;
while(current=current->next){
if(current == p) break;
cout<<"当前节点值:"<<current->data<<"下一个节点值:"<<((current->next) ? to_string(current->next->data):"目前已是尾节点")<<endl;
}


}

 

标签:Node,node,current,C++,next,链表,插入,Link,data
来源: https://www.cnblogs.com/daniel123/p/16287054.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有