#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node * next;
struct Node * prior;
}LinkList;
LinkList * Init_List(); // 初始化链表
bool Creat_List(LinkList * L); // 创建链表
int Length_List(LinkList * L); // 链表长度
bool Insert_List(LinkList * L, int pos, DataType x); // 插入结点
bool Delete_List(LinkList * L, int pos, DataType * x); // 删除结点
void Traverse_List(LinkList * L); // 遍历链表
int main()
{
DataType x;
LinkList * L = NULL;
if(L = Init_List())
printf("双链表初始化成功!\n");
else
printf("双链表初始化失败!\n");
if(Creat_List(L))
printf("双链表创建成功!\n");
else
printf("双链表创建失败!\n");
printf("遍历双链表:");
Traverse_List(L);
printf("双链表长度:%d\n\n",Length_List(L));
if(Insert_List(L,4,6))
{
printf("插入成功!\n");
printf("插入结点:第4个结点\n");
printf("插入元素:6\n");
}
else
printf("元素插入失败!\n");
printf("遍历双链表:");
Traverse_List(L);
if(Delete_List(L,3,&x))
{
printf("删除成功!\n");
printf("删除结点:第3个结点\n");
printf("删除元素:%d\n",x);
}
else
printf("元素删除失败!\n");
printf("遍历双链表:");
Traverse_List(L);
}
LinkList * Init_List()
{
LinkList * L = (LinkList*)malloc(sizeof(LinkList)); // 创建头结点并返回头结点的地址
if(!L)
{
printf("申请空间失败!\n");
exit(-1);
}
L->prior = L->next = NULL;
return L;
}
bool Creat_List(LinkList *L)
{
int i,n,val;
LinkList * Tail = L;
printf("请输入双链表结点的个数:");
scanf("%d",&n);
for(i = 0; i<n; ++i)
{
printf("第%d个结点:", i+1);
scanf("%d",&val);
LinkList * p = (LinkList*)malloc(sizeof(LinkList));
if(!p)
{
printf("申请空间失败!\n");
exit(-1);
}
p->data = val;
p->prior = Tail->next;
Tail->next = p;
p->next = NULL;
Tail = p;
}
return true;
}
int Length_List(LinkList * L)
{
int cnt = 0;
LinkList * p = L->next;
while(p!=NULL)
{
cnt++;
p = p->next;
}
return cnt;
}
bool Insert_List(LinkList * L, int pos, DataType x)
{
int i = 1;
LinkList * p = L->next;
if(pos<1||pos>Length_List(L))
return false;
while(i<pos-1&&p)
{
i++;
p = p->next; // p指向被插入结点的前一个结点
}
if(p)
{
LinkList * q = (LinkList*)malloc(sizeof(LinkList));
if(!q)
{
printf("申请空间失败!\n");
exit(-1);
}
q->data = x;
q->next = p->next;
q->prior = p;
p->next->prior = q;
p->next = q;
return true;
}
else
return false;
}
bool Delete_List(LinkList * L, int pos, DataType * x)
{
int i = 1;
LinkList * p = L->next;
if(pos<1||pos>Length_List(L))
return false;
while(i<pos-1&&p)
{
i++;
p = p->next;
}
if(p)
{
LinkList * q = p->next;
*x = q->data;
p->next = q->next;
q->next->prior = p;
free(q);
return true;
}
else
return false;
}
void Traverse_List(LinkList * L)
{
LinkList * p = L->next;
while(p!=NULL)
{
printf("%3d",p->data);
p = p->next;
}
printf("\n\n");
}