哥们你这是数据结构上的吧。。。。。。学数据结构要灵活。。。。。
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站建设、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的南岸网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
这里给你一个建立链表的程序:(以SDUTOJ 2116题为例题)
#include iostream
using namespace std;
class List
{
public:
int data;//数据域,用来记录数据
List *next;//指着域,用来记录它下一个节点的地址
//访问这个变量能找到它的下一个节点
};
void del(List *p)//递归释放内存
{
if(p == NULL)//p为NULL说明p访问到链表结尾了
return ;//访问到结尾返回
del(p-next);//如果没访问到结尾,会在这里一直调用函数本身递归,直到遇见NULL
delete p;//遇到NULL返回到head的时候,从后向前删除节点,释放内存
//如果从前面删除的话就会把本节点的next值也给删除了,就没办法访问到下一个节点了
//如果定义一个临时变量先记录下一个节点地址然后再删除本节点也是可以解决这个问题的
}
//void del(List *head)
//{
// List *p = head,*q;
// while(p)
// {
// q = p;
// p = p-next;
// delete q;
// }
//}//这样释放内存也是可以的
int main()
{
List *head = new List;//new开辟内存,地址赋给head,head代表这个
//链表的头,访问head能找到这个链表
head-next = NULL;//初始状态下只有head链节,他没有后继结点,所以他的next值为NULL(空)
List *p,*q;//p是游动指针,建立链表的时候永远指向最后一个链节
//q是开新内存用的,也就是增加一个新的链节
int n;//输入数的个数
cinn;
p = head;//初始状态下只有head一个链节,那么最后一个链节也是head,让p指向head
for(int i = 0;i n;i++)
{
q = new List;//增加新的链节q
cinq-data;//给新链节的data赋值
p-next = q;//把q挂在p(初始值是head)的后面
q-next = NULL;//新链节是链表的最后一个链节,后面没有后继,那么,就把他的next值设为NULL(空)
p = q;//q成为p的后继之后,q就是最后一个节点,我们规定p指向最后一个节点,这里就把q赋给p
}//循环完成后,链表就建立完了,head是他们的头
p = head-next;//p在上面是指向最后一个元素,以便于增加新的链节后能很快的放在它的后面,达到添加链节的目的
//现在我们就发动他的游动特点,来访问整个链表,从上面看来,我们输入的第一个整数放在q-data
//里面了,并没有放在head里面,那么,我们访问的话,head的下一个节点才是第一个存储节点,用p
//访问head的next,判就指向了链表中的第一个存储输入数的节点(真正第一个节点是head,因为head
//因为head的data没有值,所以,我们说head的后面第一个节点为有效节点)
while(p != NULL)//当p访问不到NULL的时候,就会一直循环,NULL是链表结束的标志
{
coutp-data;//输出p访问到的每个节点的data值
if(p-next != NULL)
cout" ";//这两行是调格式的,为了能在最后不多输出空格,其实只是为了在OJ上AC
p = p-next;//p访问把本节点的next值,p就指向下一个节点,相当于向后移动一个节点
}
coutendl;
del(head);//释放内存
return 0;
}
c语言中,动态链表的使用方法:
1、创建节点的结构体类型,里面要有一个指向此类型结构的指针。
2、建立一个头指针,一个尾指针
3、每次有新节点进入链表时,用malloc分配空间,然后用链表尾端的节点指针指向新节点,新节点的指针指向null。
typedefstruct_List{intdata;struct_List*next;}List;intQuery(List**head,intx){List*p=(*head)-next;intn=1;while(pp-data!=x){p=p-next;n++;}if(p)returnn;elsereturn-1;}