参考其他人的双向链表实现,搞了一个便于自己理解的练练笔。
#include<iostream>
#include<string.h>
using namespace std;
//定义一个节点
typedef struct DoubleLinkNode
{
int data;
struct DoubleLinkNode* pre;
struct DoubleLinkNode* next;
DoubleLinkNode(int x):data(x),pre(NULL),next(NULL) {}
}Node;
// 创建一个链表
Node* create_list(int* nums, int n)
{
if(n<1)
return NULL;
Node* head,*_next,*_pre;
head = new Node(*nums);
_pre = _next = head;
for(int i=1;i<n;i++)
{
_next = new Node(*(nums+i));
_pre->next = _next;
_next->pre = _pre;
_pre = _pre->next;
}
return head;
}
// 打印一个链表
void print_list(Node* head)
{
if(head==NULL)
{
cout<<"emptyList"<<endl;
}
Node* p = head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<'\n';
}
//获取链表长度
int getlength(Node* head)
{
if(head==NULL)
return 0;
int len = 0;
Node* p = head;
while(p!=NULL)
{
len++;
p = p->next;
}
return len;
}
// 插入到任意位置(位置从1开始)
Node* insert_front(Node* head,int n,int x)
{
if(n <= 1) //插到头节点之前
{
Node*newnode = new Node(x);
newnode->next = head;
head->pre = newnode;
head = newnode;
return head;
}
if(n > getlength(head)) //插到尾节点之后
{
Node*p = head;
while(p->next!=NULL)
{
p=p->next;
}
Node* newnode = new Node(x);
p->next = newnode;
newnode->pre = p;
return head;
}
Node*p = head;
int i = 1;
while (i<n-1 && p!=NULL)
{
i++;
p = p->next;
}
if(p==NULL)
{
return NULL;
}
else
{
Node* newnode = new Node(x);
newnode->next = p->next;
p->next->pre = newnode;
p->next = newnode;
newnode->pre = p;
}
return head;
}
// 删除节点(位置从1开始)
Node* delete_node(Node*head,int n)
{
if(n<1||n>getlength(head))
{
return head;
}
int i = 1;
Node* p = head;
Node* dele;
if(n==1)//删除头节点
{
dele = head;
dele->next->pre = NULL;
head = dele->next;
delete dele;
return head;
}
while (i<n-1 && p!=NULL)
{
i++;
p = p->next;
}
if(p->next->next!=NULL)
{
dele = p->next;
dele->next->pre = p;
p->next = dele->next;
delete dele;
}
else
{
dele = p->next;
p->next = NULL;
delete dele;
}
return head;
}
int main()
{
int nums[] = {1,7,3,6,8,6,7};
Node* head = create_list(nums,7);
print_list(head);
cout<<getlength(head)<<endl;
head = insert_front(head,7,2);
print_list(head);
head = delete_node(head,1);
print_list(head);
return 0;
}