高分求一个删除单链表中值为x的所有元素的函数

2024-12-12 20:14:02
推荐回答(5个)
回答1:

NODE *newlist(NODE *L,int x)
{
NODE * t ;//声明一个代替根节点L的节点
if(L.value == x){//根节点的值为x
t = L->next; //将T指向L的下一个节点
delete L; //删除L节点
return newlist(t,x);//递归处理首节点值为x的情况
}
t = L; //将t指向根节点
while(t->next != null){ //节点的下一个节点不为空
if(t->next.value == x){ //满足条件
t->next = t->next->next; //删除满足条件的节点
}
}
return t;
}

我是这么理解的
先判断首节点的值
若首节点满足则将首节点的下一节点保存下来
遍历下一节点
若不满足则对下一节点进行判断
遍历玩整个链表即可
应该是比较简单的啊
思路很清晰的啊
【呵呵
见笑了
刚写的
没在VS里运行呢
是忘了加t=t->next了

我是搞java的
想翻翻c++
见笑了
呵呵

我看了下二楼的
貌似可以】

回答2:

这个我学数据结构时写过链表.
这里说明一下,结构体和你的类似.
链表的第一个节点不储存数据.
有完整的测试输入输出函数,可以试试.
不需要递归的.
你最好仅参考一下,然后自己写.

输入:
1 2 3 4 1 3 5 6 1 1
输出:
6 5 3 4 3 2

#include "stdio.h"

typedef struct Node{
int data;
struct Node *next;
}Node, *LinkList;

void ListDeleteAll(LinkList &L, int e) { //你要求的函数,由于传的是引用,便不需要返回值了.e是要删除的
LinkList p=L->next;
LinkList q=L;
while(p) {
if(p->data==e) {
q->next=p->next;
delete p;
}
else
q=p;
p=q->next;
}
}

void PrintList(LinkList L) { //打印链表中的值
LinkList p=L->next;
while(p) {
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}

void ValueList(LinkList &L,int n) { //建表,我这里用的是头插入的建表方式,即先输入的,在链表尾,n是元素个数
L=new Node;
L->next=NULL;
LinkList p;
for(int m=0;mp=new Node;
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}

int main() {
LinkList L;
ValueList(L,10);
PrintList(L);
ListDeleteAll(L,1);
PrintList(L);
return 0;
}

回答3:

已经测试过.

NODE *newlist(NODE *L,int x)
{
NODE *p,*t;

while(L){
if(L->data==x) {p=L; L=L->next; free(p);}
else break;
}

if(L)
{
p=L;
while(p->next)
{
if(p->next->data==x) {t=p->next;p->next=p->next->next;free(t);}
else p=p->next;
}
}
return L;
}

递归效率低.不用递归代码也不会多

回答4:

//---------------------------------------------------------------------------

#include
#include /*用到了free()函数*/

typedef struct NODE{
int data;
struct NODE *next;
} NODE;

NODE *newlist(NODE *L,int x)/*在从L开始的链表中,删除数据成员为x的结点*/
{
NODE *t;
if (L==NULL) return NULL;

else if (L->data==x) {
t=L;
L=newlist(L->next ,x);
free(t);
return L;
}
else {
L->next =newlist(L->next ,x);
return L;
}

}
NODE *cr(void)/*建表,用于演示newlist()函数的效果,以0结束输入*/
{
int i;
NODE *b=NULL;
scanf("%d",&i);
if (i!=0) {
b=malloc(sizeof(NODE));
b->data =i;
b->next =cr();
}
return b;

}
int main(void)
{
NODE *a=cr();
a=newlist(a,2);/*示例,删除其中数据成员为2的结点*/
while (a!=NULL)/*示例,输出删除后的链表*/
{ printf("%d\n",a->data );
a=a->next ;
}

return 0;
}
//---------------------------------------------------------------------------

回答5:

现在会的人还真多啊,我都抢不上了,呵呵

NODE *newlist(NODE *L,int x)
{
NODE *p=L,*q,*p_first=NULL,*p_last=NULL;

while(*p)
{
if(p->data!=x)
{
if(p_first==NULL){p_first=p_last=p;}
else{p_last->next=p;p_last=p;}
p=p->next;
}
else
{
q=p;
p=p->next;
free(q);
}
}
p_last->next=NULL;
return p_first;
}