双向链表,顾名思义,就是比单链表多了一个方向,可以在使用时更加灵活的选择下一个节点,就像是在马路上建设了双向道路,在拐弯点可以随时转弯,某些情况下可以增加代码效率。
那么接下来就开始实现双向链表吧!💕
- [ 👌] 首先是创建一个拥有两个方向的结构体
typedef struct yaya {
int num;
char name[20];
struct yaya *next;
struct yaya *up;
}ya;//和单向链表很相似,但是在此基础上我们多了一个指向上一个节点的指针
- [ 👌] 接下来写主函数
int main(void){
int ch;
ya *head = NULL;
ya *p;
p = (ya*)malloc(sizeof(ya));
p->next =NULL;
p->up = NULL;
head = p;
printf("请开始输入你的数据\n");
while (1){
add(head);
//这一步创建了链表的头节点,我们的链表就从这里开始不断延长
- [ 👌]现在我们开始实现节点的添加
void add(ya *head){
ya *p,*q;
p = (ya*)malloc(sizeof(ya));
q = head;
//为新节点输入数据
printf("输入序号\n");
scanf("%d",&p->num);
printf("输入姓名");
scanf("%s",p->name);
//开始把节点链接到链表上,用的是头插法
if(q->next!=NULL){
p->next = head->next ;
p->up = head;//新节点的上一个是头节点
head->next = p;
}
else{
head->next = p;
p->up = head;
}
pr1(head);
};
- [👌 ] 最后我们将这个链表打印出来,当然还可以根据实际需求不同方向打印
void pr1(ya*head){
ya*find;
find = head->next;
printf("现在正着输出\n");
{
while (find!= NULL) {
printf("%d\n", find->num);
printf("%s\n", find->name);
find = find->next;
}
}
}
这样一个双向链表的创建就完成啦~