加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

单链表指定元素删除

(2013-11-04 16:48:33)
标签:

单链表

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");

}

当然,此程序还有很大的变通性,譬如不单单是数字的单链表,能够指定更多参数的单链表,又或者是双链表等等。都可以通过修改此程序来实现,它的作用只是一个简单的模板而已。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有