数据结构之双链表

//双链表
#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;//你需要将原先头节点的下一个元素的prior指向你现在新的节点的地址
newNode->prior=Head;//新节点的prior呢就指向head
Head->next=newNode;
}
else{
//第一个节点只需要将新节点prior指向head就好,其他没什么特别的
printf("第一个节点创建\n");
Node *newNode;
newNode=createNewNode(target);
newNode->next=Head->next;
newNode->prior=Head;
Head->next=newNode;
}

}

//尾插法
Node* insert_tail(Node *tail,ElemType target)
{
Node *newNode;
newNode=createNewNode(target);
tail->next=newNode;
newNode->prior=tail;
return newNode;
}

//根据下标插入结点
void random_insert(Node *head,int index,ElemType target)
{
int index_count=0;
Node *pMove;
pMove=head->next;
while(pMove)
{
if(index_count==index-1)//因为你要的是插入到index的位置,所以在index-1处插入,你就是index了
{
Node *newNode=createNewNode(target);
newNode->next=pMove->next;
pMove->next=newNode;
return;
}
index_count++;
pMove=pMove->next;
}
}

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

//按下标查找
void query_index(Node *head,ElemType index)
{
int tmp_count=0;
Node *pMove;
pMove=head->next;
while(pMove)
{
if(tmp_count==index)
{
printf("找到数值%d,下标为%d\n",pMove->data,tmp_count);
return;
}
tmp_count++;
pMove=pMove->next;
}
if(pMove==NULL&&index!=tmp_count)
{
printf("未找到该下标\n");
}
}

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

int tmp_count=0;

while(pMove)
{
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;//用删除目标的下一个节点把删除目标替换,删除成功
}

tmp_count++;
pMove=pMove->next;
}
}

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

while(pMove)
{
printf("%d ",pMove->data);
pMove=pMove->next;
}
printf("\n");
}

void print_backward(Node *tail)
{
Node *pMove;
pMove=tail;
//因为head节点的存在,所以我们得把判断条件设为这个
while(pMove->prior)
{
printf("%d ",pMove->data);
pMove=pMove->prior;
}
printf("\n");
}


int main()
{
Node *head=createHead();
int cot=5;
//尾插法测试

Node* tail=insert_tail(head,8);
while(cot--)
{
tail=insert_tail(tail,cot);
}

/*
//头插法测试
while(cot--)
{
insert_front(head,cot);
}
*/

print_forward(head);
print_backward(tail);

printf("删除掉第二位数据\n");
delete_node(head,2);
print_forward(head);
print_backward(tail);

return 0;
}

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