双链表
在单链表的每个结点中再设置一个指向上一跳的前驱结点的指针域
//结构体定义
typedef struct _node
{
dataType data; //链表中的数据域
struct _node *next; //链表的下一跳
struct _node *prior; //链表的上一跳
}LinkNode,*LinkedList;
//双链表
//创建结点
DLinkedList DlistCreatNode(dataType data)
{
DLinkedList node = (DLinkedList)malloc(sizeof(DLinkedList));
if(NULL == node)
{
perror("DlistCreatNode err");
return NULL;
}
node->data = data;
node->next = NULL;
node->prior = NULL;
return node;
}
//头插法
int DlistInsertHead(DLinkedList L,dataType data)
{
DLinkedList p = DlistCreatNode(data);
if(NULL == p)
{
perror("DlistCreatNode err");
return -1;
}
p->next = L->next;
p->prior = L;
L->next->prior = p;
L->next = p;
return 0;
}
//尾插法
int DlistInsertTail(DLinkedList L,dataType data)
{
DLinkedList temp = L;
while(temp->next)
{
temp = temp->next;
}
DLinkedList p = DlistCreatNode(data);
if(NULL == p)
{
perror("DlistCreatNode err");
return -1;
}
temp->next = p;
p->prior = temp;
return 0;
}
//以序号插入
int DlistInsertIndex(DLinkedList L,int i,dataType data)
{
int n = 0;
DLinkedList temp = L;
while(temp->next && n < i - 1)
{
temp = temp->next;
}
if(n < (i-1) || !temp)
{
return -2;//超出链表长度
}
DLinkedList p = DlistCreatNode(data);
if(NULL == p)
{
perror("DlistCreatNode err");
return -1;
}
p->next = temp->next;
p->prior = temp->prior;
temp->next->prior = p;
temp->next = p;
return 0;
}
//删除某一值得结点
int DlistDeleteValue(DLinkedList L,dataType data)
{
int n = 0;
DLinkedList temp = L;
while(temp->next )
{
temp = temp->next;
if(temp->data == data)
{
temp->next->prior = temp->prior;
temp->prior->next = temp->next;
n++;
}
}
return n;
}
//printList
int printDLinkList(DLinkedList L)
{
DLinkedList temp = L;
while(temp->next)
{
temp = temp->next;
printf("%4d ",temp->data);
}
printf("\r\n");
return 0;
}
int main()
{
//双链表
DLinkedList d_List;
dList = DlistCreatNode(NULL);
for(int i = 100;i < 110;i++)
DlistInsertTail(d_List,i); //创建一个链表
printDLinkList(d_List);
DlistInsertHead(d_List,99);
printDLinkList(d_List);
return 0;
}