本文介绍在linux环境中,用c语言实现双向循环链表的尾插,中间某处插入,删除以及查询的操作。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
typedef struct node
{
int data;
struct node *prev;
struct node *next;
} ST;
//初始化链表
void init_dlinklist(ST *p)
{
p->data = 0;
p->prev = p->next = p;
}
//尾插
bool insert_tar(ST*p,int new_data)
{
ST*pnew = (ST*)malloc (sizeof(ST));
pnew ->data = new_data;
pnew ->prev = pnew->next = pnew;
pnew ->prev = p->prev;
pnew ->next = p;
p->prev->next = pnew;
p->prev = pnew;
}
//中间插入
bool insert_tar_middle(ST*p,int tar,int new_data)
{
ST*pnew = (ST*)malloc (sizeof(ST));
pnew ->data = new_data;
ST*pcur;
for(pcur = p->next;pcur!=p;pcur = pcur->next)
{
if(pcur->data == tar)//************************遍历链表寻找要插入的位置
{
pnew ->next = pcur->next;
pnew->prev = pcur;
pcur ->next = pnew;
}
}
}
//删除
bool delete_tar(ST*p,int tar)
{
ST*pcur;
for (pcur = p->next;pcur!=p;pcur = pcur->next)//***遍历链表寻找要删除的数据
{
if (pcur->data == tar)
{
pcur->prev->next = pcur->next;
pcur->next->prev = pcur->prev;
free(pcur);
}
}
}
//输出
bool print_st(ST*p)
{
ST*pcur;
for(pcur = p->next;pcur!=p;pcur = pcur->next)
{
printf("%d<=====>",pcur->data);
}
putchar('\n');
}
int main(int argc, const char *argv[])
{
ST head;
init_dlinklist(&head);
insert_tar(&head,10);
insert_tar(&head,20);
insert_tar(&head,10);
insert_tar(&head,40);
insert_tar_middle(&head,30,99);
delete_tar(&head,10);
print_st(&head);
return 0;
}