首页 > 代码库 > 双向链表笔记
双向链表笔记
双向链表增删,准备未来复习自己用
#include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct node *next,*pre; }NODE; ///测试双向链表 void showLink(NODE *p) { while(p) { printf("%d ",p->data); p=p->next; } puts(""); } ///双向链表插入 void addNode(NODE *head,NODE *tail) { int x; puts("请输入插入的数字X,将在X后添加X"); scanf("%d",&x); NODE *p=head,*q; ///在尾部添加 if(tail->data=http://www.mamicode.com/=x) { q=(NODE *)malloc(sizeof(NODE)); q->data=http://www.mamicode.com/x; tail->next=q; q->pre=tail; tail=q; tail->next=NULL; return ; } ///在中间添加 while(p) { if(p->data=http://www.mamicode.com/=x) { q=(NODE *)malloc(sizeof(NODE)); q->data=http://www.mamicode.com/x; q->pre=p; q->next=p->next; q->next->pre=q; p->next=q; ///break;///加上break只找一个x,不加找所有x } p=p->next->next;///添加x后,p要跳过添加的x否则在加的x后加x而死循环。正常只需一个next } } ///删除节点 void delNode(NODE **head,NODE **tail) { int x; NODE *p=(*head),*q=p->next; if(*head==NULL) { puts("链表空"); return ; } puts("请输入删除结点的数值:"); scanf("%d",&x); ///删除头结点 if((*head)->data=http://www.mamicode.com/=x) { q=*head; *head=(*head)->next; (*head)->pre=NULL; free(q); return ; } ///删除尾结点 if((*tail)->data=http://www.mamicode.com/=x) { q=*tail; *tail=(*tail)->pre; (*tail)->next=NULL; free(q); return ; } ///删除中间结点 while(q) { if(q->data=http://www.mamicode.com/=x) { p->next=q->next; q->next->pre=p; q=p->next; } else { q=q->next; p=p->next; } } } int main() { int a; NODE *head,*tail,*p; head=tail=NULL; while(~scanf("%d",&a)) { p=(NODE *)malloc(sizeof(NODE)); p->data=http://www.mamicode.com/a; p->next=NULL; p->pre=NULL; if(head==NULL) { head=tail=p; } else { tail->next=p; p->pre=tail; tail=p; } } //showLink(tail); //addNode(head,tail); delNode(&head,&tail);//删除头结点,尾结点需要改变头尾指针所以用双重指针 showLink(head); return 0; }
双向链表笔记
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。