c语言实现双链表基本功能的实验报告,C语言数据结构 双向链表以及基本功能实现...

#ifndef _LIST_H_

#define _LIST_H_

#include

#include

typedef int LTDataType;

typedef struct ListNode {

LTDataType _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, LTDataType x);//后插

void ListPopBack(List* plist);//后删

void ListPushFront(List* plist, LTDataType x);

void ListPopFront(List* plist);

ListNode* ListFind(List* plist, LTDataType x);//查找

void ListMerge(List* pList1, List* pList2);//将有序链表有序合并

void ListInsertFront(ListNode* pos, LTDataType x);

void ListInsertAfter(ListNode* pos, LTDataType x);

// ????pos??????????

void ListErase(ListNode* pos);//删除

void ListRemove(List* plist, LTDataType x);//移除指定

void ListRemoveAll(List* plist, LTDataType x);//移除指定的全部

void ListPrint(List* plist);//打印

#endif /*_LIST_H_*/

具体功能实现:

void ListInit(List* plist)

{

plist->_head = (ListNode*)malloc(sizeof(ListNode));

plist->_head->_next = plist->_head;

plist->_head->_prev = plist->_head;

}

void ListDestory(List* plist)

{

while (plist->_head->_next != plist->_head)

{

ListPopFront(plist);

}

free(plist->_head);

plist->_head = NULL;

}

void ListPushBack(List* plist, LTDataType x)

{

ListInsertFront(plist->_head, x);

}

void ListPopBack(List* plist)

{

ListErase(plist->_head->_prev);

}

void ListPushFront(List* plist, LTDataType x)

{

ListInsertAfter(plist->_head, x);

}

void ListPopFront(List* plist)

{

ListErase(plist->_head->_next);

}

ListNode* ListFind(List* plist, LTDataType x)

{

ListNode* cur;

for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)

{

if (cur->_data == x)

{

return cur;

}

}

return NULL;

}

void ListMerge(List* pList1, List* pList2)//将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

{

ListNode* cur1=pList1->_head->_next, *cur2=pList2->_head->_next;

ListNode* tmp1, *tmp2;

while (cur1 != pList1->_head&&cur2 != pList2->_head)

{

if (cur1->_data > cur2->_data)

{

tmp1 = cur1->_prev;

tmp2 = cur2->_next;

tmp1->_next = cur2;

cur2->_next = cur1;

cur1->_prev = cur2;

cur2->_prev = tmp1;

cur2 = tmp2;

}

else

{

cur1 = cur1->_next;

}

}

if (cur1 == pList1->_head)

{

tmp2 = pList2->_head->_prev;

cur2->_prev = cur1->_prev;

cur1->_prev->_next = cur2;

tmp2->_next = cur1;

cur1->_prev = tmp2;

}

free(pList2->_head);

pList2->_head = NULL;

}

void ListInsertFront(ListNode* pos, LTDataType x)

{

ListNode* cur = (ListNode*)malloc(sizeof(ListNode));

cur->_data = x;

cur->_next = pos;

cur->_prev = pos->_prev;

pos->_prev->_next = cur;

pos->_prev = cur;

}

void ListInsertAfter(ListNode* pos, LTDataType x)

{

ListNode* cur = (ListNode*)malloc(sizeof(ListNode));

cur->_data = x;

cur->_prev = pos;

cur->_next = pos->_next;

pos->_next->_prev = cur;

pos->_next = cur;

}

// ????pos??????????

void ListErase(ListNode* pos)

{

pos->_prev->_next = pos->_next;

pos->_next->_prev = pos->_prev;

free(pos);

}

void ListRemove(List* plist, LTDataType x)

{

ListNode * cur = ListFind(plist, x);

if (cur)

{

ListErase(cur);

}

}

void ListRemoveAll(List* plist, LTDataType x)

{

ListNode* cur;

for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)

{

if (cur->_data == x)

{

ListErase(cur);

}

}

}

void ListPrint(List* plist)

{

ListNode* cur;

if (plist->_head == NULL)

{

printf("NULL\n");

return;

}

printf("head->");

for (cur = plist->_head->_next; cur != plist->_head; cur = cur->_next)

{

printf("%d-> ",cur->_data);

}

printf("head\n");

}

原文:https://blog.51cto.com/14232799/2422352

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值