链表有单链表,双链表,环链表
做一模块,用链表防止内存泄漏,定义一个链表,需要一结构体
链表内存不是连续的,链表的缺点,找某个数字。数组就找到a[5],而链表还要链式遍历才可以找到,查找没有优势
1:一般的形式打印出链表
//创建一个struct这样类型的结构体,
struct MyStruct
{
int data;//数据域
struct MyStruct *pNext;//指针域,任何类型的指针都是4个字节,它的大小就确定了
};
void main()
{
struct MyStruct *p;//头结点
//分别创建几个结构体s1.s2,s3,s4,s5
struct MyStruct s1;
struct MyStruct s2;
struct MyStruct s3;
struct MyStruct s4;
struct MyStruct s5;
//向简单的把他们链起来,怎么连
s1.data = 1;
s2.data = 2;
s3.data = 3;
s4.data = 4;
s5.data = 5;
p = &s1;
s1.pNext = &s2;
s2.pNext = &s3;
s3.pNext = &s4;
s4.pNext = &s5;
s5.pNext = NULL;
printf("%d\n",p->data);
printf("%d\n", p->pNext->data);
printf("%d\n", p->pNext->pNext->data);
printf("%d\n", p->pNext->pNext->pNext->data);
printf("%d\n", p->pNext->pNext->pNext->pNext->data);
system("pause");
}
2://创建一指针px等于p,用for循环的方式遍历这个链表
//创建一个struct这样类型的结构体,
struct MyStruct
{
int data;//数据域
struct MyStruct *pNext;//指针域,任何类型的指针都是4个字节,它的大小就确定了
};
void main()
{
struct MyStruct *p;//头结点
//分别创建几个结构体s1.s2,s3,s4,s5
struct MyStruct s1;
struct MyStruct s2;
struct MyStruct s3;
struct MyStruct s4;
struct MyStruct s5;
//向简单的把他们链起来,怎么连
s1.data = 1;
s2.data = 2;
s3.data = 3;
s4.data = 4;
s5.data = 5;
p = &s1;
s1.pNext = &s2;
s2.pNext = &s3;
s3.pNext = &s4;
s4.pNext = &s5;
s5.pNext = NULL;
//创建一指针px等于p,用循环的方式遍历这个链表
for (struct MyStruct *px = p; px != NULL;px=px->pNext)//轮巡
{
printf("%d %p %p\n",px->data,px,px->pNext);
}
system("pause");
}
3://用递归把这个链表打印出来,递归就是一个函数调用的过程,(顺序和逆序,printf放在上面是顺序,放在下面是逆序)
//创建一个struct这样类型的结构体,
struct MyStruct
{
int data;//数据域
struct MyStruct *pNext;//指针域,任何类型的指针都是4个字节,它的大小就确定了
};
void show(struct MyStruct *p)//参数必须是一指针
{
if (p==NULL)
{
return;
}
else{
//printg放在上面是顺序
printf("%d %p %p\n",p->data,p,p->pNext);
show(p->pNext);//跳到下一个结点
/* printf放在下面是逆序
show(p->pNext);//跳到下一个结点
printf("%d %p %p\n", p->data, p, p->pNext);*/
}
}
void main()
{
struct MyStruct *p;//头结点
//分别创建几个结构体s1.s2,s3,s4,s5
struct MyStruct s1;
struct MyStruct s2;
struct MyStruct s3;
struct MyStruct s4;
struct MyStruct s5;
//向简单的把他们链起来,怎么连
s1.data = 1;
s2.data = 2;
s3.data = 3;
s4.data = 4;
s5.data = 5;
p = &s1;
s1.pNext = &s2;
s2.pNext = &s3;
s3.pNext = &s4;
s4.pNext = &s5;
s5.pNext = NULL;
用递归把这个链表打印出来,递归就是一个函数调用的过程,(顺序和逆序,printf放在上面是顺序,放在下面是逆序)
show(p);
system("pause");
}
4: 用while循环打印链表
//创建一个struct这样类型的结构体,
struct MyStruct
{
int data;//数据域
struct MyStruct *pNext;//指针域,任何类型的指针都是4个字节,它的大小就确定了
};
void main()
{
struct MyStruct *p;//头结点
//分别创建几个结构体s1.s2,s3,s4,s5
struct MyStruct s1;
struct MyStruct s2;
struct MyStruct s3;
struct MyStruct s4;
struct MyStruct s5;
//向简单的把他们链起来,怎么连
s1.data = 1;
s2.data = 2;
s3.data = 3;
s4.data = 4;
s5.data = 5;
p = &s1;
s1.pNext = &s2;
s2.pNext = &s3;
s3.pNext = &s4;
s4.pNext = &s5;
s5.pNext = NULL;
//用while循环怎么做
while (p!=NULL)
{
printf("%d",p->data);
p = p->pNext;
}
system("pause");
}