
正文
php链表数据结构 php链式写法
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
链表是一种数据结构还是数据类型
链表这个词,既是一种数据结构(当你在数据结构与算法中讨论它的时候),也是一种数据类型(当你在某一种程序设计语言中讨论它的时候)。
当它指一种数据结构的时候,他的结构是抽象的,大概描述了元素是有前后顺序的,可以遍历,但一般不可以随机访问。它通常有头,尾,而且可以快速的增删头尾。大概就是这样的结构了。这种操作也都是指在内存中的操作。
当它指一种数据类型的时候,通常是说的某种语言里面实现了链表这种数据结构对应的数据类型。比如C++ 中的 list ,R 中的 list, Java中的ArrayList,等等。不同语言的链表类型实现细节不同,提供的操作函数也不完全相同,有的甚至差别还挺大。具体要看这个语言实现的方式。
相关问答
Q1: 数据结构链表的创建
#includestdio.h
#includemalloc.h
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*Linklist;
void create_list(Linklist L,int len); // 这里,括号里的参数写完全就好了
int main()
{
Linklist L;
int length=5;
create_list(L,length);
return 0;
}
void create_list(Linklist L,int len){
int i;
L = (Linklist)malloc(sizeof(LNode));
L-next = NULL;
for (i = len; i 0; i--)
{
Linklist p = (Linklist)malloc(sizeof(LNode));
p-data = i;
p-next = L-next;
L-next = p;
}
}
上面代码的第8 行
void create_list(Linklist L,int len); // 这里,括号里的参数写完全就好了
Q2: 链表是什么!那个编程语言中有的,和数组有什么区别
一、主体不同
1、链表:是一种物理存储单元上非连续、非顺序的存储结构。
2、数组:是有序的元素序列。是用于储存多个相同类型数据的集合。
二、特点不同
1、链表:由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
2、数组:是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。
三、数据顺序不同
1、链表:数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
2、数组:数组中的各元素的存储是有先后顺序的,在内存中按照这个先后顺序连续存放在一起。
参考资料来源:百度百科-链表
参考资料来源:百度百科-数组
Q3: 深入PHP中的HashTable结构详解
深入PHP中的HashTable结构详解
深入PHP中的HashTable结构详解
对php内核有一定了解的人应该都知道php的精髓就是HashTable,HashTable在php的实现中无处不在。包括php的数组、什么全局变量、局部变量的作用域等等,php的hashtable拆开来说就是四部分:
hash函数:用的是time33的散列函数,将一个字符串的key转换成一个数字
一个C数组:用来储存桶(buckets)的
两个双向的链表:第一个双向链表是数组的每个元素(桶bucket)是一个双向链表,这样做是为了解决hash冲突;第二个双向链表是数组将每一个桶(bucket)连接起来,这里要连接的也就是第一个双向链表的链表头,这样做是为了遍历整个hash表用的,鸟哥有篇blog是讲php的foreach的,这里这样设计就是给foreach用的==《深入理解PHP之数组(遍历顺序)》
我这里不再说hashtable的struct和bucket的`struct了,因为下面的推荐链接几乎都讲了,我不觉得我能描述和说的比他们好,每个人的水平不一样,我就以我现在的技术水平来描述,所以我就只把我整理的一些东西记录一下
下面是php中hash实现的两个文件:zend_hash.c zend_hash.h。这两个文件里面实现了一堆的api,也引申出了一堆的api,下面是实现出来的api的原型
复制代码 代码如下:
ZEND_API ulong zend_hash_func(const char *arKey, uint nKeyLength)
ZEND_API ulong zend_get_hash_value(const char *arKey, uint nKeyLength)
ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC)
ZEND_API void zend_hash_set_apply_protection(HashTable *ht, zend_bool bApplyProtection)
ZEND_API int _zend_hash_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_quick_add_or_update(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int _zend_hash_index_update_or_next_(HashTable *ht, ulong h, void *pData, uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC)
ZEND_API int zend_hash_rehash(HashTable *ht)
static int zend_hash_do_resize(HashTable *ht)
ZEND_API int zend_hash_del_key_or_index(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, int flag)
ZEND_API void zend_hash_destroy(HashTable *ht)
ZEND_API void zend_hash_clean(HashTable *ht)
static Bucket *zend_hash_apply_r(HashTable *ht, Bucket *p)
ZEND_API void zend_hash_graceful_destroy(HashTable *ht)
ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht)
ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void *argument TSRMLS_DC)
ZEND_API void zend_hash_apply_with_arguments(HashTable *ht TSRMLS_DC, apply_func_args_t apply_func, int num_args, …)
ZEND_API void zend_hash_reverse_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC)
ZEND_API void zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size)
ZEND_API void _zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, void *tmp, uint size, int overwrite ZEND_FILE_LINE_DC)
static zend_bool zend_hash_replace_checker_wrapper(HashTable *target, void *source_data, Bucket *p, void *pParam, merge_checker_func_t merge_checker_func)
ZEND_API void zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, uint size, merge_checker_func_t pMergeSource, void *pParam)
ZEND_API int zend_hash_find(const HashTable *ht, const char *arKey, uint nKeyLength, void **pData)
ZEND_API int zend_hash_quick_find(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h, void **pData)
ZEND_API int zend_hash_exists(const HashTable *ht, const char *arKey, uint nKeyLength)
ZEND_API int zend_hash_quick_exists(const HashTable *ht, const char *arKey, uint nKeyLength, ulong h)
ZEND_API int zend_hash_index_find(const HashTable *ht, ulong h, void **pData)
ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h)
ZEND_API int zend_hash_num_elements(const HashTable *ht)
ZEND_API int zend_hash_get_pointer(const HashTable *ht, HashPointer *ptr)
ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr)
ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_ex(const HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool duplicate, HashPosition *pos)
ZEND_API int zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
ZEND_API int zend_hash_get_current_data_ex(HashTable *ht, void **pData, HashPosition *pos)
ZEND_API int zend_hash_update_current_key_ex(HashTable *ht, int key_type, const char *str_index, uint str_length, ulong num_index, int mode, HashPosition *pos)
ZEND_API int zend_hash_sort(HashTable *ht, sort_func_t sort_func, compare_func_t compar, int renumber TSRMLS_DC)
ZEND_API int zend_hash_compare(HashTable *ht1, HashTable *ht2, compare_func_t compar, zend_bool ordered TSRMLS_DC)
ZEND_API int zend_hash_minmax(const HashTable *ht, compare_func_t compar, int flag, void **pData TSRMLS_DC)
ZEND_API ulong zend_hash_next_free_element(const HashTable *ht)
void zend_hash_display_pListTail(const HashTable *ht)
void zend_hash_display(const HashTable *ht)
;
Q4: 数据结构链表
//删除链表中指定范围php链表数据结构的数据
# include stdio.h
# include stdlib.h
int main ()
{
int x,min,max;
struct node
{
int num;
struct node * next;
};
struct node *p,*q,*head,*temp1,*temp2,*temp3;
head=NULL;
scanf("%d",x);
while(x!=0)
{
p=(struct node *)malloc(sizeof(struct node));
p-num=x;
p-next=NULL;//思考这里为什么要写上这句
if(head==NULL)
{
head=p;
}
else
{
q-next=p;
}
q=p; //q指向链表的尾部
scanf("%d",x);
}
temp1=head;
printf("筛选前的链表php链表数据结构:");
while(temp1!=NULL)
{
//原代码printf("%d\t",temp1-num);
printf("%d ",temp1-num);
temp1=temp1-next;
}
if(head==NULL)
{
printf("链表没有数据.\n");
return 0;
}
printf("\n请输入最小值及最大值php链表数据结构:");
scanf("%d %d",min,max);
temp2=head;
struct node *preNode; //preNode是temp2的前一个指针
int nValue;
preNode=head;
while(temp2!=NULL)
{
nValue=temp2-num;
//用闭区间[min,max],考虑相等的情况
if(nValue=min nValue=max)
{
if(temp2==head)
{
head=temp2-next;
free(temp2);
temp2=head;
preNode=temp2;
}
else
{
preNode-next=temp2-next;
free(temp2);
temp2=preNode-next;
}
}
else
{
preNode=temp2; //preNode是temp2的前一个指针
temp2=temp2-next;
}
}
//原代码的while循环出现死循环,跳不出来.
/*
while(temp2-next!=NULL)
{
if(minhead-numhead-nummax)
{
head=head-next;
temp2=head;
//free(head);
}
else
if(mintemp2-next-numtemp2-next-nummax)
{
temp2-next=temp2-next-next;
free(temp2-next);
temp2=temp2-next;
}
}
*/
printf("筛选后的链表:");
if(head==NULL)
{
printf("链表没有数据.");
}
else
{
temp3=head;
while(temp3!=NULL)
{
//原代码printf("%d\t",temp3-num);
printf("%d ",temp3-num);
temp3=temp3-next;
}
}
return 0;
}
Q5: 是PHP难还是C语音难?
C要难得多!
原因:
1 PHP数据结构有数组,C有数组,链表,队列等
2 假如PHP写一个功能要一行代码,C一般要20行
3 一般来说PHP代码可读性更高,但性能比C差很多
4 C可以直接操作内存,PHP只能通过扩展操作
5 PHP的底层是C写的,扩展也是
php链表数据结构的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于php链式写法、php链表数据结构的信息别忘了在本站进行查找喔。







