首页 > 其他分享 >带头节点的双向循环链表

带头节点的双向循环链表

时间:2022-09-25 20:57:36浏览次数:62  
标签:node LLIST next 链表 llist 双向 newnode 节点

  1. list.h文件
点击查看代码
#ifndef LLIST_H_
#define LLIST_H_

#define NAMESIZE  32

/* 定义普通节点的类型 */
struct llist_node_st
{
	struct Node_Data *data;
	llist_node_st* prev;
	llist_node_st* next;
};

/* 定义头节点的类型 */
struct LLIST_NODE
{
	int size;
	llist_node_st head;
};

/* 给头节点类型起别名 */
typedef LLIST_NODE LLIST_S;

/* 声明普通节点下面挂的数据结构 */
typedef struct Node_Data
{
	int  stuID;
	char name[NAMESIZE];
	int  math;
}LLIST_NODE_S;

/* 声明创建链表的函数,本质是创建头节点*/
LLIST_S *llist_create(int size);

/* 声明删除链表的函数*/
void llist_destroy(LLIST_S *);

/* 声明插入节点的函数 */
int llist_insert(LLIST_S *, struct Node_Data *);

/* 遍历链表的节点 */
void llist_display(LLIST_S*);

#endif

2.list.c文件

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "llist.h"

/* 定义创建链表的函数 */
LLIST_S* llist_create(int initsize)
{
	LLIST_S* llist = NULL;

	llist = (LLIST_S*)malloc(sizeof(*llist));
	if (NULL == llist)
		return NULL;

	llist->size = initsize;
	llist->head.data = NULL;
	llist->head.prev = &llist->head;
	llist->head.next = &llist->head;

	return llist;
}

/* 定义删除链表的函数 */
void llist_destroy(LLIST_S* llist)
{
	llist_node_st * newnode;
	llist_node_st * next =NULL;

	for (newnode = llist->head.next; newnode != &llist->head; newnode = next)
	{
		next = newnode->next;
		free(newnode->data);
	}
	free(llist);
}

/* 定义插入节点的函数 */
int llist_insert(LLIST_S* llist, LLIST_NODE_S* datanode)
{
	llist_node_st* node = &llist->head;
	llist_node_st* newnode;

	newnode = (llist_node_st*)malloc(sizeof(*newnode));
	if (NULL == newnode)
		return -1;
	
	newnode->data = (Node_Data*)malloc(llist->size);
	if (NULL == newnode->data)
		return -1;
	memcpy(newnode->data, datanode, llist->size);

	newnode->next = node->next;
	newnode->prev = node;
	node->next = newnode;
	return 0;
}


/* 定义遍历节点的函数 */
void llist_display(LLIST_S* llist)
{
	llist_node_st* node;
	for (node = llist->head.next; node != &llist->head; node = node->next)
	{
		printf("学生%s的学号是%d,数学成绩是%d\n",node->data->name,node->data->stuID,node->data->math);
	}
}

  1. main.c文件
点击查看代码
#include <stdio.h>
#include <stdlib.h>

#include "llist.h"

int main()
{
	int i = 0;
	LLIST_NODE_S STU;

	/* 声明双向链表 */
	LLIST_S* llist = NULL;

	/* 创建带头结点双向链表llist */
	llist = llist_create(sizeof(LLIST_NODE_S));

	/* 插入节点 */
	for (i = 5; i > 0; i--)
	{
		STU.stuID = i;
		snprintf(STU.name, NAMESIZE, "std%d",i);
		STU.math = rand() % 100;
		llist_insert(llist,&STU);
	}

	/* 打印链表 */
	llist_display(llist);

	/* 删除链表 */
	llist_destroy(llist);

	return 0;
}

标签:node,LLIST,next,链表,llist,双向,newnode,节点
From: https://www.cnblogs.com/xuanmiao363/p/16728848.html

相关文章