现在的位置: 首页 > 综合 > 正文

链表删除分析

2019年08月08日 ⁄ 综合 ⁄ 共 1767字 ⁄ 字号 评论关闭

链表的简单实现(很简单、没完善)

 

下边代码手写的,没编译通过,删除的时候头结点什么的都没判断,自己总结用的。

 

 

#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;

}

 

 

 

 

 

 

抱歉!评论已关闭.