数据结构之循环链表

//循环双链表
#include<stdio.h>
#include<stdlib.h>
#define ElemType int

typedef struct Node{
ElemType data;
struct Node *prior,*next;
}Node;


Node *createHead()
{
Node *head=(Node*)malloc(sizeof(Node));
head->prior=NULL;
head->next=NULL;
head->data=0;
return head;
}

Node *createNewNode(ElemType a)
{
Node *newNode=(Node*)malloc(sizeof(Node));
newNode->data=a;
newNode->next=NULL;
newNode->prior=NULL;
return newNode;
}

//头插法
void insert_front(Node *Head,ElemType target)
{
if(Head->next!=NULL)
{
printf("节点创建\n");
Node *newNode;
newNode=createNewNode(target);
newNode->next=Head->next;
Head->next->prior=newNode;
newNode->prior=Head;
Head->next=newNode;
}
else{
printf("第一个节点创建\n");
Node *newNode;
newNode=createNewNode(target);
newNode->next=Head;//头尾相连 第一个节点的头指针指向head节点 , 尾指针也指向head节点
newNode->prior=Head;

Head->prior=newNode;//头尾相连 head节点的头指针指向第一节点 , 尾指针指向第一节点
Head->next=newNode;
}

}

 

 

//按值查找
Node* query_target(Node *head,ElemType target)
{
Node *tmp=NULL;
Node *pMove;
Node *tmp_ref;
tmp_ref=head;
pMove=head->next;
while(pMove)
{
if(tmp_ref==pMove)return tmp;//不能找第二遍
if(pMove->data==target)
{
tmp=pMove;
printf("存在\n");
return tmp;
}
pMove=pMove->next;
}
//没找到那么就返回空指针
printf("不存在\n");
return tmp;
}

 

//根据给出的位置,删除节点,从一开始数
void delete_node(Node *head,int index)
{
Node *pMove,*tmp;
pMove=head;//这里不能是next了,因为我们要想删除头节点的下一个节点,也就是存储数据的第一个节点,必须要到头节点的地址
tmp=head;
int tmp_count=0;


do{
printf("正在寻找目标 count=%d \n",tmp_count);
if(tmp_count==index-1)//因为你要的是删除index的位置,所以在index-1处停下,(index-1)->next就是index
{
Node *target=pMove->next;//index删除目标
target->next->prior=pMove;//目标的下一位前向指针替换为目标的前驱地址
pMove->next=target->next;//用删除目标的下一个节点把删除目标替换,删除成功
return;
}

tmp_count++;
pMove=pMove->next;
}while(pMove!=tmp);
}

void print_forward(Node *head)
{
Node *pMove;
pMove=head->next;

Node *tmp=head;
while(pMove)
{
if(pMove==tmp)return;
if(pMove==tmp)
{
pMove=pMove->next;
}
printf("%d ",pMove->data);
pMove=pMove->next;
}
printf("\n");
}


int main()
{
Node *head=createHead();
int cot=5;

while(cot--)
{
insert_front(head,cot);
}
print_forward(head);

printf("删除\n");
delete_node(head,1);
print_forward(head);


return 0;
}

posted @ 2022-07-15 23:01  天天掉头发  阅读(28)  评论(0编辑  收藏  举报
返回顶端