重庆云阳网站建设,怎么做网站自动采集数据,智通人才招聘网东莞,西安做企业网站哪家做的好双向链表:
即可以从头遍历到尾部和从尾部遍历到头部的链表#xff0c;每个结点包括两个链域#xff1a;前驱指针域和后继指针域#xff0c;所以比起单向链表#xff0c;其可以在任意一个结点访问前后两个结点
关于双向链表的一个完整步骤为#xff1a;
创建一个表头结构…双向链表:
即可以从头遍历到尾部和从尾部遍历到头部的链表每个结点包括两个链域前驱指针域和后继指针域所以比起单向链表其可以在任意一个结点访问前后两个结点
关于双向链表的一个完整步骤为
创建一个表头结构体包括两个部分指向表结点的指针结点个数
创建表结点结构体包括三部分数据部分指向前驱结点的指针指向后继结点的指针。
//双向链表结点类型
typedef struct node
{DATA_TYPE data; //数据域struct node *ppre; //指向前驱结点的指针struct node *pnext; //指向后继结点的指针
}DOU_NODE;
//描述双向链表属性的表头类型
typedef struct list
{DOU_NODE *phead; //双向链表头结点地址int clen; //当前链表结点个数
}DOU_LIST; 双向链表也包括以下步骤创建-插入-删除-查找-修改-销毁-遍历
创建
先用表头结构体定义一个表头函数在函数中继续用表头结构体定义一个指针P指针大小为表头结构体的大小同时让P的头结点地址指向空个数初始化为0最后将该指针返回。
DOU_LIST *create_dou_link()
{DOU_LIST *plist malloc(sizeof(DOU_LIST));if (NULL plist){perror(fail malloc);return NULL;}plist-phead NULL;plist-clen 0;return plist;
}
插入
1.先用结点结构体定义一个结点函数
函数中用结点结构体定义一个指针P大小为表头结构体的大小P的前驱与后继指针都指向空数据为输入函数的参数。
DOU_NODE *create_node(DATA_TYPE data)
{DOU_NODE *pnode malloc(sizeof(DOU_NODE));if (NULL pnode){perror(fail malloc);return NULL;}pnode-data data;pnode-pnext NULL;pnode-ppre NULL;return pnode;
}2.将返回的结点与表头链接
先判断表头是否指向空值如果指向则将表头的指针赋值为结点如果不指向空值即不是空链表则新结点的后端指向表头的头即旧结点1表头的头的前驱指向新结点2表头的头指向结点3clen加一 代码如下
int push_head_dou_link(DOU_LIST *plist, DOU_NODE *pnode)
{if (NULL plist || NULL pnode){return -1;}if (is_empty_dou_link(plist)){plist-phead pnode;}else{pnode-pnext plist-phead;plist-phead-ppre pnode;plist-phead pnode;}plist-clen;return 0;
}
删除
用结点结构体创建一个指针其值初始化为表头的头即所有结点表头的头指向新的指针的下一个结点即空出一个结点用free函数释放新指针同时clen减一。
nt pop_head_dou_link(DOU_LIST *plist)
{if (is_empty_dou_link(plist)){return 0;}DOU_NODE *ptmp plist-phead;plist-phead ptmp-pnext;if (NULL ! plist-phead){plist-phead-ppre NULL;}free(ptmp);plist-clen--;return 0;
}
遍历、销毁
遍历的步骤为用结点的结构体定义一个结点指针初始化值为表头的头然后打印结点指针的data使结点指针的值等于结点指针的后驱结点然后循环以上步骤即完成了遍历正向遍历。打印结点指针的data使结点指针的值等于结点指针的前驱结点然后循环以上步骤即完成了反向遍历。
销毁即是只要表头不指向空就一直进行删除操作等表头指向空时free表头即可。
查找、修改
查找建立在遍历的基础上首先定义一个结点指针初始化值为表头的头然后将输入的值查找值与结点指针的data对比相同则返回该值不同则使结点指针的值等于结点指针的后驱结点并循环直到相同为止。
修改步骤与查找相同只不过是在找到后把返回改为将结点指针的data修改为自己想改成的值。