单链表指定元素删除

标签:
单链表delete重复项指定数据模板 |
分类: 设计心得 |
本程序是一个比较简单的单链表删除操作,能够对存在重复数据的单链表进行指定数据的删除,并且数据也不需要事先排好序。针对单链表删除,删除一个节点后需要释放该节点指针的情况,这里巧妙的应用了”化整为一“的方法,先通过RemoveRepeat函数删除单链表的重复项,再去执行单链表的删除操作,能够更加简单的实现我们预期的效果。
实现效果:
http://s3/mw690/002UMOy3gy6DXuPUNQS82&690
注:这里的2指的是元素值,而并不是元素位置。(结果是删除了所有指定元素为2的链表)
程序如下:
#include
#include
#include
typedef struct LNode
{
int data;
struct LNode *next;
}
LNode,*LinkList;
LinkList InitList()//创建一个带头结点的空链表
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return(L);
}
void Creat(LinkList L,int x)//创建链表
{
LinkList s,p;
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
p=L;
while(p->next)
p=p->next;
s->next=NULL;
p->next=s;
}
void Delete(LinkList L, int x)
{
LinkList p = L->next;
LinkList q = L;
LinkList tmp;
while (p != NULL)
{
if (p->data == x)
{
break;
}
else
{
q = p;
p = p->next;
}
}
q->next = p->next;
p->next = NULL;
}
void RemoveRepeat(LinkList L, int x)
{
LinkList p=L->next, q, ptr;
while(p!=NULL)
{
q=p;
ptr=p->next;
while (ptr!=NULL)
{
if (ptr->data==p->data && ptr->data==x)
{
q->next=ptr->next;
free(ptr);
ptr=q->next;
}
else
{
q=ptr;
ptr=ptr->next;
}
}
p=p->next;
}
}
void main()//主函数
{
LinkList L,p;int x,i;
L=InitList();
printf("请输入五个元素:\n");
for(i=0;i<5;i++)
{
scanf("%d",&x);
Creat(L,x);
}
printf("请输入要删除的元素\n");
scanf("%d",&x);
RemoveRepeat(L,x);
Delete(L,x);
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
system("pause");
}
当然,此程序还有很大的变通性,譬如不单单是数字的单链表,能够指定更多参数的单链表,又或者是双链表等等。都可以通过修改此程序来实现,它的作用只是一个简单的模板而已。