/**
* @brief 双链表的初始化,建立,插入,查找,删除
* @author ranqy374
* @date 2013.6.26
*/
#include <stdio.h>
#include <stdlib.h>
//双链表结点类型的定义
typedef struct Node {
int data;
struct Node *prior;
struct Node *next;
}DLNode;
//尾插法建立双链表,版本1
DLNode *rearCreateList1()
{
int i;
DLNode *head, *rear;
head = (DLNode *)malloc(sizeof(DLNode));//申请头结点
head->next = NULL;
rear = head; //rear 为指向终端结点的指针
int t[5] = { 5, 6, 9, 10, 12 }; //利用尾插法建立一个以数组t的元素为结点的双链表
for ( i = 0; i < 5; ++i ) {
DLNode *p; //要添加的结点
p = (DLNode *)malloc(sizeof(DLNode));
p->data = t[i];
rear->next = p;
p->prior = rear;
rear = p;
}
rear->next = NULL;
return head;
}
//双链表的插入,在双链表中的第i个位置插入值为x的元素
int insertList(DLNode *head, int i, int x)
{
int index = 1;
if ( head == NULL || i < 1 )
return 0; //如果双链表为空 或 要添加的结点索引号为0,返回
while ( head->next && index < i ) {
head = head->next;
index++;
}
if ( head->next == NULL )
return 0; //如果要添加的结点的位置超出双链表的表尾,返回
DLNode *p = (DLNode *)malloc(sizeof(DLNode));//创立新结点
p->data = x;
p->next = head->next;
p->prior = head;
head->next = p;
head->next->prior = p;
return 1;
}
//双链表的删除,删除双链表中第i个结点
int deleteList(DLNode *head, int i)
{
#if 0
int index = 0;
if ( head == NULL || i < 1 )
return 0; //如果双链表为空 或 要删除的结点为0,返回
while ( head->next && index < i ) {
head = head->next;
index++;
}
if ( head->next == NULL )
return 0; //如果要删除的结点不在双链表里,返回
head->prior->next = head->next;
head->next->prior = head->prior;
free(head);
return 1;
#endif
int index = 1;
if ( head == NULL || i < 1 )
return 0; //如果双链表为空 或 要删除的结点为0,返回
while ( head->next && index < i ) {
head = head->next;
index++;
}
if ( head->next == NULL )
return 0; //如果要删除的结点不在双链表里,返回
DLNode *deleteNode = head->next; //要删除的结点
deleteNode->prior->next = deleteNode->next;
deleteNode->next->prior = deleteNode->prior;
free(deleteNode);
return 1;
}
//打印输出双链表里面的元素
void printDLink(DLNode *head)
{
while ( head->next ) {
head = head->next;
printf("%d ", head->data);
}
printf("\n");
}
int main()
{
int choice = 0;
int deleteIndex = 0; //要删除的链表结点的索引号
int insertIndex = 0; //要添加的链表结点的索引号
int insertElement = 0; //要添加的结点元素
DLNode *head = (DLNode *)malloc(sizeof(DLNode));
printf("1.creat\n");
printf("2.delete\n");
printf("3.insert\n");
//printf("4.reverse\n");
//printf("5.commonNode\n");
//printf("6.createLoop\n");
//printf("7.judgeLoop\n");
printf("0.exit\n");
while ( 1 ) {
printf("please input your choice:");
scanf("%d", &choice);
switch (choice) {
case 1 :
head = rearCreateList1();
printDLink(head);
break;
case 2 :
//head = rearCreateList1();
printf("input num of delete:");
scanf("%d", &deleteIndex);
deleteList(head, deleteIndex);
printDLink(head);
break;
case 3 :
printf("input the num and element of insert:");
scanf("%d %d", &insertIndex, &insertElement);
insertList(head, insertIndex, insertElement);
printDLink(head);
break;
case 0 : exit(0); break;
}
}
}