1、类型定义
typedef struct node
{
int ele;
struct node* prior;
struct node* next;
}S_NODE;
typedef struct
{
S_NODE* head;
int length;
}S_LIST;
2、初始化链表
void InitList(S_LIST* list)
{
list->head = NULL;
list->length = 0;
}
3、在尾部添加节点
int AddNode(S_LIST* list, int ele)
{
S_NODE* p = NULL, *q = NULL;
if(list == NULL)
return -1;
p = (S_NODE*)malloc(sizeof(S_NODE));
p->ele = ele;
p->next = NULL;
p->prior = NULL;
if(list->head == NULL)
{
list->head = p;
p->next = p->prior = p;
}
else
{
q = list->head;
while(q->next != list->head)
{
q = q->next;
}
p->next = q->next;
q->next->prior = p;
q->next = p;
p->prior = q;
}
(list->length)++;
return 0;
}
4、插入节点
int InsertNode(S_LIST* list, int index, int ele)
{
S_NODE* p = NULL, *q = NULL;
int num = 1;
if(list == NULL)
return -1;
if(index < 1 || index >= list->length)
return -2;
p = (S_NODE*)malloc(sizeof(S_NODE));
p->ele = ele;
p->prior = p->next = NULL;
if(index == 1)
{
q = list->head;
while(q->next != list->head)
{
q = q->next;
}
p->next = list->head;
list->head->prior = p;
q->next = p;
p->prior = q;
list->head = p;
}
else
{
q = list->head;
while(q->next != list->head && num < index)
{
q = q->next;
num++;
}
q = q->prior;
p->next = q->next;
q->next->prior = p;
p->prior = q;
q->next = p;
}
(list->length)++;
return 0;
}
5、删除节点
int DeleteNode(S_LIST* list, int index)
{
S_NODE* p = NULL, *q = NULL;
int num = 1;
if(list == NULL)
return -1;
if(index < 1 || index > list->length)
return -2;
if(index == 1)
{
p = list->head;
q = list->head->next;
q->prior = list->head->prior;
list->head->prior->next = q;
list->head = q;
free(p);
}
else if(index == list->length)
{
q = list->head;
while(q->next != list->head)
{
q = q->next;
}
p = q->prior;
p->next = q->next;
list->head->prior = p;
free(q);
}
else
{
q = list->head;
while(q->next != list->head && num < index)
{
q = q->next;
num++;
}
p = q->prior;
p->next = q->next;
q->next->prior = p;
free(q);
}
(list->length)--;
return 0;
}
6、正向打印
void PrintList(S_LIST list)
{
S_NODE* p = NULL;
printf("list contains %d: ", list.length);
p = list.head;
while(p->next != list.head)
{
printf("%d ", p->ele);
p = p->next;
}
printf("%d\n", p->ele);
}
7、反向打印
void PrintListInvert(S_LIST list)
{
S_NODE* p = NULL;
printf("list contains %d: ", list.length);
p = list.head->prior;
while(p != list.head)
{
printf("%d ", p->ele);
p = p->prior;
}
printf("%d\n", list.head->ele);
}
8、测试
int main()
{
S_LIST la;
int i;
InitList(&la);
for(i = 0; i < 10; i++)
AddNode(&la, i);
PrintList(la);
PrintListInvert(la);
InsertNode(&la, 1, 100);
PrintList(la);
PrintListInvert(la);
InsertNode(&la, 2, 200);
PrintList(la);
PrintListInvert(la);
DeleteNode(&la, 1);
PrintList(la);
PrintListInvert(la);
DeleteNode(&la, la.length);
PrintList(la);
PrintListInvert(la);
DeleteNode(&la, 2);
PrintList(la);
PrintListInvert(la);
return 0;
}
