带头结点的单链表删除数据
LLWHdelete.c
#include<stdio.h>
#include<stdlib.h>
#include"LLWHdelete.h"
LinkedList *create(void)
{
LinkedList *l = malloc(sizeof(*l));
l->first = NULL;
l->last = NULL;
return l;
}
void insert(LinkedList *l,Node *p)
{
//如果链表为空
if(l->first == NULL)
{
l->first = p;
l->last = p;
return;
}
//找插入位置
//遍历,pr为pk前一个结点
Node *pk = l->first;
Node *pr = NULL;
while(pk)
{
if(pk->data > p->data)
{
break:
}
pr = pk;
pk = pk->next;
}
if(pk == NULL)
{
l->last->next = p;
l->last = p;
}
else
{
if(pk == l->first)
{
p->next = l->first;
l->first = p;
}
else
{
p->next = pk;
pr->next = p;
}
}
}
void delete(LinkedList *l,element x)
{
//先判断链表是否存在或为空
if(l == NULL || l->first == NULL)
{
return;
}
Node *pk = l->first;
Node *pr = NULL;
Node *q = NULL;
while(pk)
{
if(pk->data == x)
{
q = pk;
pk = pk->next;
pr->next = pk;
free(q);
}
else
{
pr = pk;
pk = pk->next;
}
}
}
void printlist(LinkedList *l)
{
if(l == NULL)
{
return;
}
Node *p = l->first;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
LLWHdelete.h
#ifndef __LLWHDELETE_H__
#define __LLWHDELETE_H__
#define element int
typedef struct node
{
element data;
struct node *next;
}Node;
typedef struct LinkedList
{
Node *first;
Node *last;
}LinkedList;
LinkedList *create(void);
void insert(LinkedList *l,Node *p);
void delete(LinkedList *L,element x);
void printlist(LinkedList *l);
#endif
main.c
#include<stdio.h>
#include<stdlib.h>
#include"LLWHdelete.h"
int main()
{
LinkedList *l = create();
int x;
while(1)
{
scanf("%d",&x);
if(x == 0)
{
break;
}
Node *p = malloc(sizeof(*p));
p->data = x;
p->next = NULL;
insert(l,p);
}
printf("删除前:\n");
printlist(l);
int n;
printf("请输入需要删除的数据:\n");
scanf("%d",&n);
delete(l,n);
printf("删除后:\n");
printlist(l);
return 0;
}