十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
你的DeleteElem我有些看不懂
创新互联-专业网站定制、快速模板网站建设、高性价比塔河网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式塔河网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖塔河地区。费用合理售后完善,10多年实体公司更值得信赖。
根据你想要的功能,给改了一下--
#include
#include
typedef
int
ElemType;
typedef
void
Status;
typedef
struct
Node
{
ElemType
data;
struct
Node
*next;
}LNode,
*LinkList;
Status
CreatList(int
,LinkList
);
Status
Traverse(LinkList
);
Status
FreeList(LinkList
);
ElemType
DelElem(LinkList
,ElemType
);
int
main()
{
int
Length;
ElemType
e;
LinkList
L;
L=(LinkList)malloc(sizeof(LNode));
L-next=NULL;
printf("Input
the
Length
of
List:\n");
scanf("%d",Length);
CreatList(Length,L);
printf("Travers
the
List
:\n");
Traverse(L);
while(1)
{
printf("请输入要删除的元素:\n");
scanf("%d",e);
if(DelElem(L,e))//在L中将元素e删除
{printf("删除%d后:\n",e);break;}
printf("未找到该元素,删除失败\n");
}
Traverse(L);
FreeList(L);
printf("List
release
Success!\n");
//system("PAUSE");return
0已经使
程序暂停
了
return
0;
}
Status
CreatList(int
Length,LinkList
L)
{
int
i;
LinkList
Body=NULL,p=L;
for
(i=0;i
next=Body;
printf("Input
the
%dth
num:\n",i+1);
scanf("%d",(Body-data));
p=Body;
}
Body-next=NULL;
}
Status
FreeList(LinkList
L)
{
LinkList
temp=NULL,p=L;
while
(p)
{
temp=p-next;
free(p);
p=temp;
}
}
Status
Traverse(LinkList
L)
{
LinkList
p=L;
p=p-next;
while(p)//while(p!=NULL)
{
printf("%d
",p-data);
p=p-next;
}
printf("\n");
}
ElemType
DelElem(LinkList
L,ElemType
e)
{
LinkList
p,q;
q=p=L;
p=p-next;//p指向
头结点
后第一个元素
while(p)
{
if(p-data==e)
{
q-next=p-next;
free(p);
return
1;
}
else{
q=p;//q始终指向p上一个结点
p=p-next;
}
}
//没有执行上个return,说明没找到
return
0;
}
假设有链表1
头结点指针为h,节点类型为
struct
node{
int
date;
struct
node*
next;
}创建链表过程就不写了,亲。
下面是删除元素x的C语言算法(将它写成函数形式):
void
Delete_X(struct
node*
h,int
x)
{
struct
node
*p,*q;
for(p=h,q=NULL;p;q=p,p=p-next){
if(p-date==x){
if(!q){
//如果删除的元素是头结点
h=q-next;
p-next=NULL;
}
//endif
else{
q-next=p-next;
p-next=NULL;
}
//endelse
}
//endif
}
//endfor
}
//end
struct LNode * delete(LNode * head)
{
LNode * node = head;
LNode ** parent = head;
double min, max;
printf("请输入min和max: ");
scanf("%lf %lf", min, max);
while (node)
{
// 大于min和小于max,则删除节点
if (node-data min node-data max)
{
*parent = node-next;
// 如果你的LNode是malloc出来的,需要free(node);
node = *parent;
}
else
{
node = node-next;
parent = node-next;
}
}
return head;
// 这个逻辑不需要给你太多注释,你只需要拿一支笔,手动画一个3个节点的链表,
// 然后从函数执行开始,一步一步去推怎么执行的就懂了。
// 至于你的程序的错误,没帮你看
}
最后面倒数第三行。 p-data==x 当节点不存在的时候p为NULL所以这时候取data错误,
另外该代码还存在内存泄露的问题(没有改)。
正确的该法:
struct node
{
int data;
struct node *next;
};
typedef struct node SLIST;
#includestdio.h
#includemalloc.h
void main()
{
void delete_snode(SLIST *head,int x);
void insert_slist(SLIST *head ,int x,int y);
void print_slist(SLIST *head);
SLIST *creat_slist();
SLIST *h;
int x,y;
int m;
scanf("%d%d",x,y);
scanf("%d",m);
h=creat_slist();
print_slist(h);
insert_slist(h,x,y);
print_slist(h);
delete_snode(h,m);
print_slist(h);
}
SLIST *creat_slist()
{
int c;
SLIST *h,*s,*r;
h=(SLIST *)malloc(sizeof(SLIST));
r=h;
scanf("%d",c);
while(c!=-1)
{
s=(SLIST *)malloc(sizeof(SLIST));
s-data=c;
r-next=s;
r=s;
scanf("%d",c);
}
r-next='\0';
return h;
}
void print_slist(SLIST *head)
{
SLIST *p;
p=head-next;
if(p=='\0')printf("no\n");
else
{
printf("head");
do
{
printf("-%d",p-data);
p=p-next;
}while(p!='\0');
printf("end\n");
}
}
void insert_slist(SLIST *head ,int x,int y)
{
SLIST *s,*p,*q;
s=(SLIST *)malloc(sizeof(SLIST));
s-data=y;
q=head;
p=head-next;
while(p!='\0'p-data!=x)
{
q=p;p=p-next;
}
s-next=p;
q-next=s;
}
void delete_snode(SLIST *head,int x)
{
SLIST *p,*q;
q=head;
p=head-next;
while(p!='\0'p-data!=x)
{
q=p;
p=p-next;
}
if(p)
if(p-data==x)
q-next=p-next;
}