不说别的 你们先看看效果~~
其实也没什么,就是输出时加了几个easyx的函数,变了颜色和背景,让本来学数据结构就烦有了一点点乐趣,ok,回归正题 ,链表,如何去写,我想这要回归到内存的认识,自己去操作内存,所以这个时候,烦人的指针出现了,通过指针来实现链表就可以快速的增删,并且在增删以后就可以把不要的节点的内存给释放,这就是一个我们难以接受的~
那好,现在我用一种不一样的链表带给大家,当然这种写法是一个老师教给了我,并且对我来说易于接受,所以在这里就分享给大家
-
用面向对象的模式写链表,别被这个名词吓到,也就是说,我们分开考虑,链表,节点,就这样就行了,
-
所以说,我们现在写创建一个链表,
-
在这里先给大家补一下我自己所认为的指针吧~~
int ^p -> 表示一个指针变量,存一个变量的内存地址,那么p就代表一个内存地址 *p就代表这个地址的数据(一个值)
int ^^p -> 表示一个指针的指针,也就是存一个指针的地址,那么^p也就代表一个地址,**p也就是去p指向的数据,
list的头文件
#pragma once
//这里就是我们的头文件list.h 这里的相关函数在下面的list cpp有实现,不用慌
struct Data {
int x, y;
int col;
char ch[20];
};
struct node {
Data data;
struct node* pnext;
};
struct list {
node* pfront;
node* prear;
int count;
};
int listinit(list** pplist);
int isempty(list* plist);
void insert(list* plist, node* pnode);
void Traverlist(list* plist, void(*Traver)(node* pnode));
list cpp
#include"list.h"
#include<cstdlib>
#include<string>
#include<algorithm>
using namespace std;
int listinit(list** pplist) {//pplist->plist 初始化链表
*(pplist) = (list*)malloc(sizeof(list));//创建一个地址
if (NULL == *pplist)return 0;
else {
(*pplist)->pfront = NULL;
(*pplist)->prear = NULL;
(*pplist)->count = 0;
}
return 1;
}
int isempty(list* plist) {
if (plist->count)return 0;
else return 1;
}
void insert(list* plist, node* pnode) {
if (isempty(plist))
plist->pfront = pnode;
else
plist->prear->pnext = pnode;
plist->prear = pnode;
plist->count++;
}
//留接口 这里才是让人耳目一新的写法
void Traverlist(list* plist, void(*Traver)(node* pnode)) {
node* ptemp = plist->pfront;
int listsize = plist->count;
while (listsize) {
Traver(ptemp);
ptemp = ptemp->pnext;
listsize--;
}
}
主函数
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include"list.h"
#include<graphics.h>
#include<conio.h>
#include<Windows.h>
using namespace std;
void show(node* pnode) {
//花里胡哨的输出来了,看不懂就直接输出就好了
//printf("x=%d\ty=%d\n", pnode->data.x, pnode->data.y);
for (int i = 0; i < 7; i++) {
if (pnode->data.ch[i] != '\0') {
setcolor(pnode->data.col);//设置颜色
outtextxy(pnode->data.x, pnode->data.y-i*18, pnode->data.ch[i]);//在坐标(x,y)输出字符ch[i]
}
else break;
}
}
void move(node* pnode) {
pnode->data.y++;
}
int main() {
initgraph(1200, 800);
setbkcolor(0xB2DFEE);//可以随便改颜色
list* plist;
listinit(&plist);
while (1) {
char s[10] = "uGgnoD";
node* pnode = (node*)malloc(sizeof(node));
pnode->data.x = rand() % 1200;
pnode->data.y = 0;
pnode->data.col = RGB(rand() % 255, rand() % 255, rand() % 255);
for (int i = 0; i < 7; i++) {
pnode->data.ch[i] = s[i];
}
pnode->data.ch[7] = '\n';
pnode->pnext = NULL;
insert(plist, pnode);
Traverlist(plist, show);
Traverlist(plist, move);
//Sleep(250);
}
return 0;
}