链表删除分析

原创 2010年05月25日 14:18:00

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

 

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

 

 

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

}

 

 

 

 

 

 

链表删除的

  • 2016年12月26日 17:25
  • 1KB
  • 下载

链表删除

bool List::Remove(int i,int& x) {  LinkNode * del,*current;  if(ilink;}  else{   current=first;...
  • u011747672
  • u011747672
  • 2013-09-26 13:12:33
  • 115

链表

  • 2008年01月22日 18:09
  • 2KB
  • 下载

双向链表元素的删除

 struct Node { int Data; struct Node* prior; struct Node* next;};/** * @brief 该函数...
  • rabbit729
  • rabbit729
  • 2009-03-09 21:11:00
  • 5926

C语言实现链表之双向链表(六)删除头结点

C语言实现链表之双向链表(六)删除头结点     上一篇文章给出了在头结点之前插入结点的函数,本篇文章将给出删除头结点的函数。依旧需要注意的是对前向指针的处理。 /*============...
  • dan15188387481
  • dan15188387481
  • 2015-11-24 17:19:48
  • 789

数据结构系列之链表——单链表删除值为num的节点

步骤: 1.遍历链表,当num不等于节点值且next不为空时为p1/p2指针赋值 2.判断p1值是否为num,是则分类分析,否则num不在链表里 3.p1是头节点,删除时把head指向头节点的下...
  • u012928324
  • u012928324
  • 2017-03-15 18:10:10
  • 375

实现双向链表删除一个节点P,在节点P后插入一个节点

双向链表删除一个节点P template void list::delnode(int p){     int k=1;     listnode *ptr,*t;     ptr=first;   ...
  • wang7890
  • wang7890
  • 2009-02-15 03:23:00
  • 1791

数据结构——10 双向链表插入和删除节点

双向链表——插入、删除指定位置和相同节点
  • u010757264
  • u010757264
  • 2016-08-18 17:06:22
  • 1099

链表删除指定位置节点

给定一个链表要求删除指定位置的节点。 例如: 原链表:1->2->3->4->5 要求删除第2个位置节点 操作后链表:1->3->4->5 要求:不能创建新的节点 源码: class Node {...
  • xukun5137
  • xukun5137
  • 2016-06-21 19:17:19
  • 2167
收藏助手
不良信息举报
您举报文章:链表删除分析
举报原因:
原因补充:

(最多只允许输入30个字)