一.头文件
#ifndef _LIST_H_
#define _LIST_H_
typedef int DataType;
typedef struct ListNode {
DataType _data;
struct ListNode* _next;
struct ListNode* _prev;
}ListNode;
typedef struct List {
ListNode* _head;
}List;
void ListInit(List* plist);
void ListDestory(List* plist);
void ListPushBack(List* plist, DataType x);
void ListPopBack(List* plist);
void ListPushFront(List* plist, DataType x);
void ListPopFront(List* plist);
ListNode* ListFind(List* plist,DataType x);
void ListInsertFront(ListNode* pos, DataType x);
void ListInsertAfter(ListNode* pos, DataType x);
void ListErase(ListNode* pos);
void ListRemove(List* plist, DataType x);
void Merge(List *plist1, List* plist2);
void ListPrint(List* plist);
#endif
二.系统功能实现
#include "head.h"
#include <stdio.h>
void ListInit(List* plist)
{
plist->_head = (ListNode *)malloc(sizeof(ListNode));
plist->_head->_prev = plist->_head;
plist->_head->_next = plist->_head;
}
void ListDestory(List* plist)
{
while (plist->_head != plist->_head->_next)
{
ListPopFront(plist);
}
free(plist->_head);
plist->_head = NULL;
}
void ListPushBack(List* plist, DataType x)
{
ListInsertFront(plist->_head, x);
}
void ListPopBack(List* plist)
{
ListErase(plist->_head->_prev);
}
void ListPushFront(List* plist, DataType x)
{
ListInsertAfter(plist->_head, x);
}
void ListPopFront(List* plist)
{
ListErase(plist->_head->_next);
}
ListNode* ListFind(List* plist, DataType x)
{
ListNode * cur;
for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)
{
if (cur->_data == x)
{
return cur;
}
}
return NULL;
}
void ListInsertFront(ListNode* pos, DataType x)
{
ListNode * cur = (ListNode *)malloc(sizeof(ListNode));
ListNode * tmp = pos->_prev;
cur->_data = x;
pos->_prev = cur;
cur->_next = pos;
tmp->_next = cur;
cur->_prev = tmp;
}
void ListInsertAfter(ListNode* pos, DataType x)
{
ListNode * cur = (ListNode *)malloc(sizeof(ListNode));
ListNode * tmp = pos->_next;
cur->_data = x;
pos->_next = cur;
cur->_prev = pos;
tmp->_prev = cur;
cur->_next = tmp;
}
void ListErase(ListNode* pos)
{
pos->_prev->_next = pos->_next;
pos->_next->_prev = pos->_prev;
free(pos);
}
void ListRemove(List* plist, DataType x)//如果有多个?
{
ListNode * cur = ListFind(plist, x);
if (cur)
{
ListErase(cur);
}
}
void ListPrint(List* plist)
{
ListNode * cur;
printf("head->");
for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)
{
printf("%d->", cur->_data);
}
printf("head");
}
void Merge(List *plist1, List* plist2)//合并两个链表
{
ListNode * cur1 = plist1->_head->_next,*cur2= plist2->_head->_next;
ListNode * tmp1;
ListNode * tmp2;
for (cur1;(cur1 != plist1->_head)&&(cur2 != plist2->_head);)
{
if (cur1->_data > cur2->_data)
{
tmp1 = cur1->_prev;
ListNode * tmp2 = cur2->_next;
tmp1->_next = cur2;
cur2->_prev = tmp1;
cur1->_prev = cur2;
cur2->_next = cur1;
cur2 = tmp2;
}
else {
cur1 = cur1->_next;
}
}
if (cur1 == plist1->_head)
{
tmp2 = plist2->_head->_prev;
cur2->_prev = cur1->_prev;
cur1->_prev->_next = cur2;
tmp2->_next = plist1->_head;
plist1->_head->_prev = tmp2;
}
}
三.测试程序
#include <stdio.h>
#include "head.h"
#include<windows.h>
int main()
{
List list,list2;
ListInit(&list);
ListPushBack(&list, 5);
ListPushBack(&list, 8);
ListPushBack(&list, 9);
ListPushFront(&list, 3);
ListPushFront(&list, 1);
ListPopFront(&list, 1);
ListPopBack(&list, 5);
ListRemove(&list, 8);
ListPrint(&list);
printf("\n");
ListInit(&list2);
ListPushBack(&list2, 6);
ListPushBack(&list2, 8);
ListPushBack(&list2, 9);
ListPushFront(&list2, 2);
ListPushFront(&list2, 1);
ListPrint(&list2);
printf("\n");
Merge(&list, &list2);
ListPrint(&list);
printf("\n");
ListDestory(&list);
system("pause");
return 0;
}
四.测试截图
明天大概率不更新,周一见