微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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


}

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐