目录
插入
// 循环双链表的元素插入
bool ListInsert(DNode **L, int i, int e) {
int j = 0;
DNode *p = *L;
DNode *s;
if (i <= 0) {
return false;
}
while (j < i - 1 && p->next != NULL) { // 查找第i-1个结点
j++;
p = p->next;
}
if (j < i - 1) { // 如果没有找到第i-1个结点
return false;
} else {
s = (DNode *)malloc(sizeof(DNode));
s->data = e;
s->next = p->next;
if (p->next != NULL) {
p->next->prior = s;
}
s->prior = p;
p->next = s;
//如果插入是在最后一个位置
if(s->next==(*L)){
(*L)->prior=s;
}
return true;
}
}
删除
//循环双链表的元素删除
bool ListDelete(DNode **L,int i,int e){
int j=0;
DNode *p=(*L);
DNode *q;
if(i<=0){
return false;
}
while(j<i-1&&p!=NULL){//查找第i-1个结点
j++;
p=p->next;
}
if(p==NULL){//未找到第i-1个结点
return false;
}else
if(p!=NULL){
q=p->next;
if(q==NULL){
return false;
}
q->data=e;
p->next=q->next;
if(q->next!=NULL){
q->next->prior=p;
}
if(q->next!=(*L)){
q->next->prior=p;
}else{
(*L)->prior=p;
}
free(q);
return true;
}
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct DNode {
int data;
struct DNode *prior;
struct DNode *next;
} DNode;
// 尾插法建立循环双链表
void CreateList(DNode **L, int arr[], int n) {
DNode *s, *r;
*L = (DNode *)malloc(sizeof(DNode)); // 创建头节点
(*L)->next = NULL; // 初始化头节点的next为NULL
r = *L;
for(int i = 0; i < n; i++) {
s = (DNode *)malloc(sizeof(DNode));
s->data = arr[i];
s->next = NULL; // 新节点的next初始化为NULL
s->prior = r; // 上一个节点为r
r->next = s; // 将当前节点链接到上一个节点
r = s; // 更新r为当前节点
}
r->prior=*L;
(*L)->prior=r;
}
// 循环双链表的元素插入
bool ListInsert(DNode **L, int i, int e) {
int j = 0;
DNode *p = *L;
DNode *s;
if (i <= 0) {
return false;
}
while (j < i - 1 && p->next != NULL) { // 查找第i-1个结点
j++;
p = p->next;
}
if (j < i - 1) { // 如果没有找到第i-1个结点
return false;
} else {
s = (DNode *)malloc(sizeof(DNode));
s->data = e;
s->next = p->next;
if (p->next != NULL) {
p->next->prior = s;
}
s->prior = p;
p->next = s;
//如果插入是在最后一个位置
if(s->next==(*L)){
(*L)->prior=s;
}
return true;
}
}
//循环双链表的元素删除
bool ListDelete(DNode **L,int i,int e){
int j=0;
DNode *p=(*L);
DNode *q;
if(i<=0){
return false;
}
while(j<i-1&&p!=NULL){//查找第i-1个结点
j++;
p=p->next;
}
if(p==NULL){//未找到第i-1个结点
return false;
}else
if(p!=NULL){
q=p->next;
if(q==NULL){
return false;
}
q->data=e;
p->next=q->next;
if(q->next!=NULL){
q->next->prior=p;
}
if(q->next!=(*L)){
q->next->prior=p;
}else{
(*L)->prior=p;
}
free(q);
return true;
}
}
// 输出函数
void PrintList(DNode *head) {
DNode *temp = head->next; // 从第一个实际数据节点开始
while (temp != NULL) {
if (temp->next == NULL) {
printf("%d\n", temp->data);
} else {
printf("%d->", temp->data);
}
temp = temp->next;
}
}
int main() {
DNode *L;
int n;
printf("请输入你想创建的循环双链表的长度:");
scanf("%d", &n);
int arr[n];
for(int i = 0; i < n; i++) {
printf("请输入你想创建的元素:");
scanf("%d", &arr[i]);
}
// 创建双链表
CreateList(&L, arr, n);
// 插入一个元素
int i;
printf("请告诉我你想把元素插入到什么位置:");
scanf("%d", &i);
int e;
printf("请告诉我你想插入的元素的值为:");
scanf("%d", &e);
if (ListInsert(&L, i, e)) {
printf("插入成功!\n");
} else {
printf("插入失败!\n");
}
PrintList(L); // 打印链表
int k;
printf("请告诉我你想删除的元素的序号为:");
scanf("%d",&k);
int x;
printf("请告诉我你想删除的元素为:");
scanf("%d",&x);
ListDelete(&L,k,x);
PrintList(L);
return 0;
}
示例
请输入你想创建的循环双链表的长度:5
请输入你想创建的元素:1
请输入你想创建的元素:2
请输入你想创建的元素:3
请输入你想创建的元素:4
请输入你想创建的元素:5
请告诉我你想把元素插入到什么位置:3
请告诉我你想插入的元素的值为:5
插入成功!
1->2->5->3->4->5
请告诉我你想删除的元素的序号为:5
请告诉我你想删除的元素为:4
1->2->5->3->5