链表删除分析
来源:互联网 发布:网络急救箱 编辑:程序博客网 时间:2024/05/13 12:56
链表的简单实现(很简单、没完善)
下边代码手写的,没编译通过,删除的时候头结点什么的都没判断,自己总结用的。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef enum _ListRet
{
RET_OK,
RET_FAIL,
RET_PARAM_FAIL
}Ret;
typedef struct _DListNode
{
int data;
struct _DListNode* next;
}DListNode;
typedef struct _DList
{
DListNode* first;
}DList;
DList* list_create(void)
{
DList* thiz=(DList*)malloc(sizeof(DListNode));
if(thiz!=NULL)
{
thiz->first=NULL;
return thiz;
}
else
{
printf("list malloc error /n");
return;
}
}
Ret list_insert(DList* thiz,int data)
{
DListNode* node=(DListNode*)malloc(sizeof(DListNode));
if(node!=NULL)
{
node->data=data;
node->next=NULL;
}
if(thiz->first==NULL)
{
thiz->first=node;
}
else
{
node->next=thiz->first;
thiz->first=node;
}
return RET_OK;
}
void list_remove(DList* thiz)
{
DListNode* prenode=thiz->first;
DListNode* node =thiz->first->next;
while(node->next!=NULL)
{
prenode=node;
node=node->next;
}
free(prenode->next);
prenode->next=NULL;
}
void list_print(DList* thiz)
{
DListNode* node=thiz->first;
while(node!=NULL)
{
printf("%d /n",node->data);
node=node->next;
}
}
int main (void)
{
int i=0;
DList* thiz=list_create();
for(;i<15;i++)
{
list_insert(thiz,i);
printf("%d",i);
}
printf("/n");
list_print(thiz);
list_remove(thiz);
printf("------------/n");
list_print(thiz);
return 0;
}
删除的时候,要是把prenode->next=NULL 改成node=NULL 链表本身其实是没变的,没删除的。因为node 是在栈上的,malloc分配的内存是在堆上的,在函数内部,node=NULL 只是把栈上自己本身设为NULL 堆上分配的不会有变化,而prenode 是用next删除的,指向堆上的位置,所以即使是在函数内部也已经把堆上的数据更改了。
链栈和链队列与链表 简单来说是一样的,就是看链表插入和删除的方式了。
注释删除的时候不能直接free(thiz->first) 会把创建的链表头结点的空间释放掉,输出的时候在去访问thiz->first->data 就会出错。
void list_removehead(DList* thiz)
{
DListNode* node=thiz->next;
if(node!=NULL)
{
thiz->first=thiz->first->next;
free(node);
node=NULL;
}
}
void list_removeend(DList* thiz)
{
DListNode* prenode=thiz->first;
DlistNode* node=thiz->first->next;
while(node->next!=NULL)
{
prenode=node;
node=node->next;
}
prenode->next=NULL;
}
- 链表删除分析
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- LCC编译器的源程序分析(67)删除内存链表
- 关于使用二级指针删除链表节点的分析
- launcher 图标删除分析
- hibenate 批量删除 分析,,,
- 关于Endianness【转】
- 在Visual Baisc.NET 2005中使用泛型
- C#中海量数据的批量插入和更新
- 你的婚姻幸福吗?
- myeclipse8.5反编译软件配置
- 链表删除分析
- 新起点
- dedecms 获取文章标题路径
- windows7使用EasyBCD硬盘安装ubuntu12.04
- 如何使用gcc编译器
- MyEclipse快捷键与插件大全
- 排列问题
- C语言18个经典问题答录
- Oracle的rownum原理和使用