链表的简单实现(很简单、没完善)
下边代码手写的,没编译通过,删除的时候头结点什么的都没判断,自己总结用的。
#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;
}