在调试过程中发现
node=l和node=l->next,这两句理解没到位,node=l就是l的地址传给node并且l没有头结点,
而node=l->next表示node链表指向l链表的第一个结点,l有头结点
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
struct node *pre;
int data;
struct node *next;
}linklist;
linklist *init(void) //链表初始化
{
linklist *l=(linklist *)malloc(sizeof(linklist)); //链表开辟结点空间
l->pre=NULL;
l->data=0;
l->next=NULL;
return l;
}
void head_insert(linklist *l,int data) //链表头插法
{
linklist *node=NULL;
node=(linklist *)malloc( sizeof(linklist));
node->data=data;
node->next=l->next;
node->pre=l;
if(l->next) //判断链表第一个结点是否为空
{
l->next->pre=node;
l->next=node;
}
else
l->next=node;
l->data++; //这局话的意思是用来记录链表的结点数,应为初始化时结点为0
/* if(l->data==0 || l->next==NULL)
{
node->next=l->next;
node->pre=l;
l->next=node;
l->data++;
}else
{
node->next=l->next;
node->pre=l;
l->next=node;
l->next->pre=node;
l->data++;
}
*/
}
void nail_insert(linklist *l,int data) //链表尾插法
{
linklist *node=NULL;
node=l; //新变量用于遍历链表
linklist *n= (linklist *)malloc(sizeof(linklist));
n->data=data;
while(node->next !=0) //遍历链表,尾插法就是必须在最后一个结点的指针域为NULL插入数据
{
node=node->next;
}
n->next=node->next;
// n->pre=node;
node->next=n;
n->pre=node;
l->data++; //记录结点数
}
int delet(linklist *l,int data) //在链表中删除数据
{
linklist *node=l->next; //node指向l的第一个结点
while(node !=NULL) //遍历
{
if(node->data==data)
{
node->pre->next=node->next;
if(node->next)
node->next->pre=node->pre;
l->data--;
free(node);
return 1;
}
node=node->next;
}
return 0;
}
void print(linklist *l) //遍历
{
linklist *node=l->next;
while(node !=NULL)
{
printf("%d->",node->data);
node=node->next;
}
printf("NULL\n");
}
int main()
{
linklist *l=NULL;
l=init();
head_insert(l,1);
head_insert(l,2);
head_insert(l,3);
head_insert(l,4);
print(l);
nail_insert(l,5);
nail_insert(l,6);
nail_insert(l,7);
print(l);
delet(l,7);
print(l);
free(l);
return 0;
}