双向链表增删,准备未来复习自己用
#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==x) { q=(NODE *)malloc(sizeof(NODE)); q->data=x; tail->next=q; q->pre=tail; tail=q; tail->next=NULL; return ; } ///在中间添加 while(p) { if(p->data==x) { q=(NODE *)malloc(sizeof(NODE)); q->data=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==x) { q=*head; *head=(*head)->next; (*head)->pre=NULL; free(q); return ; } ///删除尾结点 if((*tail)->data==x) { q=*tail; *tail=(*tail)->pre; (*tail)->next=NULL; free(q); return ; } ///删除中间结点 while(q) { if(q->data==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=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; }
时间: 2024-10-21 07:02:45