链表是c语言基本功,它考察了指针和结构体的熟练程度,最近写代码用到链表,发现单向链表在删除元素时如果没处理好的话容易出错,比如删除最后一个元素,经过一番调试,现整理代码如下。
//创建一个链表,随机删除2个node,再删除全部node
#include "stdafx.h"
#include "stdlib.h"
struct tag_list_node_t
{
int id;
struct tag_list_node_t *next;
};
struct package_t
{
int size; //list 个数
struct tag_list_node_t * mlist;
};
struct package_t package;
void list_init(struct package_t *pack,int len)
{
int i;
pack->size = len;
struct tag_list_node_t *list=(struct tag_list_node_t *)malloc(sizeof(struct tag_list_node_t)) ;
list->id = 0;
list->next = NULL;
pack->mlist = list;
for(i=1;i<pack->size;i++)
{
struct tag_list_node_t *plist = (struct tag_list_node_t *)malloc(sizeof(struct tag_list_node_t)) ;
if(plist == NULL)
{
printf("plist==null\n");
}
plist->id=i;
plist->next = NULL;
list->next = plist;
list = list->next ;
}
list->next=NULL;
}
void printlist(struct package_t * pack)
{
struct tag_list_node_t *plist = pack->mlist;
int n;
while(plist!=NULL)
{
printf("id:%d ",plist->id);
printf("\n");
plist = plist->next;
}
}
int DeleteNode(struct tag_list_node_t *pnode){
if(pnode==NULL)
{
printf("pnode==NULL\n");
return -1;
}
struct tag_list_node_t *q = pnode->next;
if(q==NULL)
{
return -2;
}
pnode->id = q->id;
pnode->next = q->next;
free(q);
q = NULL;
return 0;
}
//删除指定node
void deleteonenode(struct package_t * pack,unsigned short id)
{
struct tag_list_node_t *plist = pack->mlist;
int res =0;
while(plist!=NULL)
{
if(plist->id == id)
{
res = DeleteNode(plist);
if(res == -2)
{
struct tag_list_node_t *pre = pack->mlist;
if(pre->next==NULL)//只剩下一个尾节点
{
free(pre);
pre=NULL;
pack->mlist = NULL;
return ;
}else
{
while(pre->next!=plist)//找到前一个节点,对于单向链表
{
pre = pre->next;
}
pre->next=NULL;
free(plist);
plist = NULL;
break;
}
}else if(res == -1)
{
break;
}else if(res == 0)
{
break;
}
}
plist = plist->next;
}
}
int deleteAllNode(struct package_t *pack)
{
//struct tag_list_node_t *plist = pack->mlist;
int i;
for(i=0;i<4;i++)
{
deleteonenode(pack,i);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int n;
list_init(&package,4);
printf("all node:\n");
printlist(&package);
printf("delete one node: 3---\n");
deleteonenode(&package,3);
printlist(&package);
printf("delete one node: 0---\n");
deleteonenode(&package,0);
printlist(&package);
printf("delete all node---\n");
deleteAllNode(&package);
printlist(&package);
return 0;
}