- 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);
}
}
- 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;
}