链表
头文件
//链表有面向对象的思维
#pragma once
#include<stdlib.h>
struct Data
{
int x;
int y;
};
struct Node
{
Data data;
struct Node* pnext;
};
//这样链表就可以看成只有节点
struct List
{
struct Node* pfront;//头结点
struct Node* prear;//尾结点
int count;//节点数
};
int ListInit(List** pplist);//初始化链表
void TraverList(List* plist, void(*Traver)(Node* node));//遍历链表
int IsEmpty(List* plist);//判断链表是否为空
void InstList(List* plist, Node* pnode);//插入链表
源文件
#include"list.h"
int ListInit(List **pplist)//链表初始化
{
*pplist = (List*)malloc(4);//开辟空间
if (*pplist == NULL)
return 0;
else
{
(*pplist)->pfront = NULL;
(*pplist)->prear = NULL;
(*pplist)->count = 0;
return 1;
}
}
void TraverList(List* plist, void(*Traver)(Node* node))//遍历链表,函数接口
{
Node* ptemp = plist->pfront;
int size = plist->count;
while (size)
{
Traver(ptemp);
ptemp = ptemp->pnext;
size--;
}
}
int IsEmpty(List* plist)//判断链表是否为空
{
if (plist->count = 0)
return 1;
else
return 0;
}
void InstList(List* plist, Node* pnode)//插入
{
if (IsEmpty(plist))//如果链表为空,那么头插法和尾插法一样
{
plist->pfront = pnode;
plist->prear = pnode;
plist->count++;
}
else//尾插法
{
plist->prear->pnext = pnode;
plist->prear = pnode;
plist->count++;
}
}
#include<stdio.h>
#include<stdlib.h>
#include"list.h"
#include<graphics.h>
void ShowData(Node* pnode)//显示节点内容
{
// outtextxy(pnode->data.x, pnode->data.y);
printf("%d\t%d\n", pnode->data.x, pnode->data.y);
}
int main(void)
{
List* plist;
ListInit(&plist);
for (int i = 10; i < 0; i--)
{
Node* pnode = (Node*)malloc(sizeof(Node));//每次插入都需要开辟空间
pnode->data.x = 5;
pnode->data.y = 10;
pnode->pnext = NULL;
//IsEmpty( plist);
InstList(plist, pnode);
}
TraverList(plist, ShowData);
return 0;
}
//这样更简单,可以把链表简化为只有节点,易于操作

浙公网安备 33010602011771号