建立,插入,删除
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<conio.h>
using namespace std;
typedef struct student
{
int data;
struct student *next;
struct student *pre;
}dnode;
//创建双链表
dnode* creat()
{
dnode *head, *p, *s;
int x;
int cycle = 1;
head = (dnode*)malloc(sizeof(dnode));
p = head;
while(cycle)
{
scanf_s("%d", &x);
if(x != 0)
{
s = (dnode*)malloc(sizeof(dnode));
s->data = x;
p->next = s;
s->pre = p;
p = s;
}
else{
cycle = 0;
}
}
head = head->next;
head->pre = nullptr;
p ->next = nullptr;
return head;
}
//删除节点
dnode* del(dnode* head, int num)
{
dnode *p1, *p2;
p1 = head;
p2 = head;
while(num != p1->data && p1->next != nullptr)
{
p1 = p1->next;
}
if(num == p1->data)
{
if(p1 == head)//头部
{
head = head->next;
head->pre = nullptr;
free(p1);
}
else if(p1->next == nullptr)//结尾
{
p1->pre->next = nullptr;
free(p1);
}
else{//中间
p1->next->pre = p1->pre;
p1->pre->next = p1->next;
}
}
else{
printf("%d could not found.", num);
}
return head;
}
//插入节点
dnode* insert(dnode* head, int num)
{
dnode *p0, *p1;//p0是要插入的节点,p1是遍历到的节点
p1 = head;
p0 = (dnode*)malloc(sizeof(dnode));
p0->data = num;
while(p0->data > p1->data && p1->next != nullptr)
{
p1 = p1->next;
}
if(p0->data <= p1->data)
{
if(head == p1)
{
p0->next = p1;
p1->pre = p0;
p0->pre = nullptr;
head = p0;
}
else{
p1->pre->next = p0;
p0->next = p1;
p0->pre = p1->pre;
p1->pre = p0;
}
}
else{
p1->next = p0;
p0->pre = p1;
p0->next = nullptr;
}
return head;
}
int length(dnode* head)
{
int n = 0;
dnode* p;
p = head;
while(p)
{
p = p->next;
n++;
}
return n;
}
void print(dnode* head)
{
dnode *p;
int n;
n = length(head);
printf("These %d records are:\n", n);
p = head;
if(head != nullptr)
{
while(p)
{
printf("%d ", p->data);
p = p->next;
}
}
}
int main()
{
dnode *head;
head = creat();
print(head);
cout << "删除1:" << endl;
head = del(head, 1);
print(head);
cout << "插入1:" << endl;
head = insert(head,1);
print(head);
return 0;
}