双向链表构建、删除、销毁等

此代码包含头文件 主函数 cpp三个文件


头文件
#pragma once
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *prior;//存储其前驱地址
struct Node *next;//存储其后继地址
}DLNode, *DLinkList;
void InitDLinkList(DLinkList list);
int GetLength(DLinkList list);
int InsertDLinkListPos(DLinkList list, ElemType val, int pos);
int InsertDLinkListHead(DLinkList list,ElemType val) ;
int InsertDLinkListTail(DLinkList list,ElemType val);
void ShowDLinkList(DLinkList list);
void RShowDLinkList(DLinkList list);
int DeleteDLinkListPos(DLinkList list, int pos);
int DeleteDLinkListHead(DLinkList list);
int DeleteDLinkListTail(DLinkList list);
void ClearDLinkList(DLinkList list);
void DestoryDLinkList(DLinkList list);


cpp代码:
#include “dlist.h”
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
//判断循环链表是否为空
static void DeterPoinetNULL (DLinkList list)
{
assert(list != NULL);
if(list == NULL)
{
exit(0);
}
}
//为循环链链表申请空间
static DLinkList _ApplyNode(ElemType val, DLinkList prior, DLinkList next)
{
DLinkList s = (DLinkList)malloc(sizeof(DLNode));
assert(s != NULL);

s->data = val;
s->prior = prior;
s->next = next;

return s;

}
//定义循环链表
void InitDLinkList(DLinkList list)
{
DeterPoinetNULL(list);
list->prior = list->next = NULL;
}
//得到循环链表的长度
int GetLength(DLinkList list)
{
DeterPoinetNULL(list);
int count = 0;
DLinkList p = list;
while(p != NULL)
{
count++;
p = p->next;
}
return count;
}
//按位置插入链表
int InsertDLinkListPos(DLinkList list, ElemType val, int pos)
{
DeterPoinetNULL(list);
if(pos < 0 || pos > GetLength(list))
{
printf(“Pos is Error, Insert Fail \n”);
return 0;
}
DLinkList p = list;

while(pos)
{
	p = p->next ;
	pos--;
}
DLinkList s = _ApplyNode(val,p,p->next);
if(p->data != NULL)
{
	p->next->prior = s;
}
p->next = s;
return 1;
//调用函数按位置插
//	return InsertDLinkListPos(list, val, 2);

}
// 头插
int InsertDLinkListHead(DLinkList list,ElemType val)
{
DeterPoinetNULL(list);

DLinkList s = _ApplyNode(val, list, list->next);

if(list->next != NULL)
{
	list->next->prior = s;
}
list->next = s;
return 1;
//调用函数头插
//	return InsertDLinkListPos(list, val, 0);

}
//在尾部插入
int InsertDLinkListTail(DLinkList list,ElemType val)
{
DeterPoinetNULL(list);
DLinkList p = list;
while(p->next != NULL)
{
p = p->next;
}
DLinkList s = _ApplyNode(val,p,p->next);
p->next = s;
return 1;
//调用函数尾插
//return InsertDLinkListPos(list,val,GetLength(list));
}
//打印循环链表
void ShowDLinkList(DLinkList list)
{
DeterPoinetNULL(list);
DLinkList p = list->next;
while§
{
printf("%d “,p->data);
p = p->next;
}
printf(”\n");
}
//逆置打印循环链表
void RShowDLinkList(DLinkList list)
{
DeterPoinetNULL(list);

DLinkList p = list->next;
while(p->next != NULL)
{
	p = p->next;
}
while(p != list)
{
	printf("%d ",p->data);
	p = p->prior;
}
printf("\n");

}
//按位置删除
int DeleteDLinkListPos(DLinkList list, int pos)
{
DeterPoinetNULL(list);

if (pos < 0 || pos >= GetLength(list))
{
	printf("Pos is Error, Delete Fail\n");
	return 0;
}

DLinkList p = list;

while (pos)
{
	p = p->next;
	pos--;
}

DLinkList q = p->next;

p->next = q->next;

if (q->next != NULL)
{
	q->next->prior = p;
}

free(q);

return 1;

}
//头删
int DeleteDLinkListHead(DLinkList list)
{
return DeleteDLinkListPos(list, 0);
}
//尾删
int DeleteDLinkListTail(DLinkList list)
{
return DeleteDLinkListPos(list, GetLength(list) - 1);
}
//清空
void ClearDLinkList(DLinkList list)
{
DeterPoinetNULL(list);

while (list->next != NULL)
{
	DeleteDLinkListHead(list);
}

}
//销毁
void DestoryDLinkList(DLinkList list)
{
ClearDLinkList(list);
}


包含主函数cpp
#include <stdio.h>
#include “dlist.h”

;int main()
{
DLNode head;
InitDLinkList(&head);
for(int i = 0; i < 5; i++)
{
InsertDLinkListHead(&head,i);
}
ShowDLinkList(&head);
RShowDLinkList(&head);
DeleteDLinkListPos(&head,2);
ShowDLinkList(&head);

扫描二维码关注公众号,回复: 10895992 查看本文章
return 0;

}

发布了27 篇原创文章 · 获赞 1 · 访问量 483

猜你喜欢

转载自blog.csdn.net/weixin_45836151/article/details/105588427
今日推荐