看:
#include<stdio.h>
#include<stdlib.h>
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* prev;
struct ListNode* next;
LTDataType data;
}ListNode;
ListNode* BuyListNode(LTDataType x)//申请一个结点
{
ListNode* NewNode = (ListNode*)malloc(sizeof(ListNode));
NewNode->prev = NULL;
NewNode->next = NULL;
NewNode->data = x;
return NewNode;
}
ListInit(ListNode** pphead)//初始化一个头指针
{
*pphead = BuyListNode(0);
(*pphead)->prev = *pphead;
(*pphead)->next = *pphead;
}
void ListPrint(ListNode* phead)//打印
{
ListNode* cur = phead->next;
while (cur != phead)
{
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n\n");
}
void ListPushBack(ListNode* phead, LTDataType x)//尾插
{
ListNode* tail=phead->prev;
ListNode* newnode = BuyListNode(x);
tail->next = newnode;
newnode->prev = tail;
newnode->next = phead;
phead->prev = newnode;
}
ListNode* ListFind(ListNode* phead, LTDataType x)//查找x的位置
{
ListNode* cur = phead->next;
while (cur != phead)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void ListInsert(ListNode* pos, LTDataType x)//pos位置前面插入
{
ListNode* newnode = BuyListNode(x);
ListNode* posPrev = pos->prev;
posPrev->next = newnode;
newnode->prev = posPrev;
newnode->next = pos;
pos->prev = newnode;
}
void ListErase(ListNode* pos)//删除pos位置的结点
{
ListNode* posPrev = pos->prev;
ListNode* posNext = pos->next;
free(pos);
posPrev->next = posNext;
posNext->prev = posPrev;
}
void ListClear(ListNode* phead)//清理链表
{
ListNode* cur = phead->next;
while (cur != phead)
{
ListNode* Next = cur->next;
free(cur);
cur = Next;
}
phead->next = phead;
phead->prev = phead;
}
void ListDestory(ListNode** pphead)//销毁链表
{
ListClear(*pphead);
free(*pphead);
*pphead =NULL;
}
void ListTest2()
{
ListNode* phead = NULL;
ListInit(&phead);
printf("尾插1,2,3,4,5,6: \n");
ListPushBack(phead, 1);
ListPushBack(phead, 2);
ListPushBack(phead, 3);
ListPushBack(phead, 4);
ListPushBack(phead, 5);
ListPushBack(phead, 6);
ListPrint(phead);//先尾插形成一个链表,以供后面的操作
printf("pos位置前插入数据的操作:\n");
ListNode* pos1 = ListFind(phead, 3);
ListInsert(pos1, 30);
ListNode* pos2 = ListFind(phead, 4);
ListInsert(pos2, 40);
ListPrint(phead);
printf("pos位置删除的操作:\n");
ListErase(pos1);
ListErase(pos2);
ListPrint(phead);
printf("清理操作:\n");
ListClear(phead);
printf("清理操作完成\n\n");
printf("销毁操作:\n");
ListDestory(&phead);
printf("销毁操作完成\n");
}
int main()
{
ListTest2();
return 0;
}
说一点:
void ListInsert(ListNode pos, LTDataType x);* //pos前面插入一个数
void ListErase(ListNode pos);* //删除pos位置处的结点
学了这两个操作后:尾插,尾删,头插,头删,都就可以被放到这两个函数中实现。
比如:
头插:ListInsert(phead->next,1);
尾插:ListInsert(phead->prev,2);
头删:ListErase(phead->next);
尾删:ListErase(phead->prev);
注意:别忘了链表清理和销毁在实际运用时的意义