本帖最后由 超神级 于 2014-6-22 23:11 编辑
关于3动态内存分配这篇明天补上.可以明天再来.
关于链表篇的话就使用<问题出现解决问题的思路来讲>
数组和链表的区别:
数组: 优点:使用方便 ,查询效率 比链表高,内存为一连续的区域
缺点:大小固定,不适合动态存储,不方便动态添加
链表:
优点:可动态添加删除 大小可变
缺点:只能通过顺次指针访问,查询效率低
在访问方式上
数组可以随机访问其中的元素
链表则必须是顺序访问,不能随机访问
空间的使用上
链表可以随意扩大
数组则不能
好了上面都是老套话现在真正开始:
在数据的存储上数组和链表有显著的区别(地址的连续和不连续)我们怎么解决这个问题使得链表可以近似于数组
因为我们之前学过了结构体我们可以定义一个这样的结构体使得当前的链表节点可以找到下一个节点
可以定义一个这样的一个结构体
struct ahc
{
int shuju;//数据
int *xia;//存储下个节点的地址
}
┌─ ───────┬───┐
│data数据 │next 下个│
└─────────┴───┘
看到上面的那个图像了把先来几个链表的专业术语记不记无所谓的
图像里面的head是头节点..然后依次是是首节点...尾节点...
有了上面那个结构体我们就可以试着写链表了‘
我们先这样写
#include<stdio.h>
#include<malloc.h>//动态内存分配要的头文件
struct ahc
{
int shuju;
struct ahc*xia;//下一个节点的地址..
};
int main()
{
ahc to;
return 0;
}
这样写了以后我们还要写一部分算法,分配几块内存然后把他们串起来...假设我们需要5个节点
写好后应该是这个样子
#include<stdio.h>
#include<malloc.h>//动态内存分配要的头文件
struct ahc
{
int shuju;
struct ahc*xia;//下一个节点的地址
};
struct ahc *hanshu(void)
{
int b,c;
struct ahc*to=(struct ahc*)malloc(sizeof(struct ahc));//VC6上不强制转换编译通不过。。。=_=!.
struct ahc*to2=to;
for(b=1;b<=5;b++)
{
printf("请输入你要增加的shuju\n");
scanf("%d",&c);
struct ahc*xia2=(struct ahc*)malloc(sizeof(struct ahc));
xia2->shuju=c;
to2->xia=xia2;///to=to2->xia;两种方式
}
return to;
}
int main()
{
ahc *to;
to=hanshu();
return 0;
}
简单吧核心代码就十几句.
关键点:
为什么要建立to2这个指针呢?????
我们把to的指向的那块储存空间赋值给了to2,to2也就是相当于to。
因为如果我们不定义to2节点的话to节点一直在变化我们就找不到指针的首地址了。
xia2->shuju=c;
to2->xia=xia2;///to=to2->xia;两种方式
为什么找不到呢!观察上面两段语句.
关键点:
to2->xia=xia2;
ps:观察上面语句。不要搞混了xia和xia2的关系.
...然后要考虑到多方面因素我们还需要加些代码。
例如我们不知道链表什么时候会结束(在我们不知道几个节点的情况下)
#include<stdio.h>
#include<malloc.h>//动态内存分配要的头文件
struct ahc
{
int shuju;
struct ahc*xia;//下一个节点的地址
};
struct ahc *hanshu(void)
{
int b,c;
struct ahc*to=(struct ahc*)malloc(sizeof(struct ahc));//VC6上不强制转换编译通不过。。。=_=!.
struct ahc*to2=to;
for(b=1;b<=5;b++)
{
printf("请输入你要增加的shuju\n");
scanf("%d",&c);
struct ahc*xia2=(struct ahc*)malloc(sizeof(struct ahc));
xia2->shuju=c;
to2->xia=xia2;///to=to2->xia;两种方式
xia2->xia=NULL;
}
return to;
}
int main()
{
ahc *1to;
to=hanshu();
return 0;
}
//比上面的代码多了个xia2->xia=NULL;这是为了什么.加个结束符,便于操作.
好了现在差不多了..明天再写遍历和释放内存,
|