首页 新闻 赞助 找找看

单链表DelList函数出了问题

0
悬赏园豆:10 [已解决问题] 解决于 2021-04-05 15:01

#include<stdio.h>
#include<stdlib.h>
//定义单链表的数据类型
typedef struct book
{
	char name[10];
	char code[10];
	float price;
}book; 
typedef book Book;

//定义单链表 
typedef struct LNode
{
	Book data;
	struct LNode *next;
}LNode,*LinkList;

//初始化
void InitLNode(struct LNode*L)
{
	L=(LNode*)malloc(sizeof(LNode));
	if (!L)
	{
		printf("分配空间出错,初始化失败!");
		exit(1);
	}
	L->next=NULL;
} 

//头插法,创建单链表 
LNode* creatList(void)
{
	LNode *head;
	LNode *s;
	LNode *p;
	Book c;
	head=(LNode*)malloc(sizeof(LNode));
	p=head;
	p->next=NULL;
    printf("请输入新节点的数据,当最后输入的值小于等于0时建表完成,该值不接入链表\n");
    scanf("%s%s%f",&c.name,&c.code,&c.price); 
	while (c.price>0)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->next=p->next;
		p->next=s;
		s->data=c;
	    printf("请输入书名,编码和价格:\n");
		scanf("%s%s%f",&c.name,&c.code,&c.price); 
	}
	printf("creatList函数执行,创建链表成功\n");
	return head;
}

//单链表的长度
int length(struct LNode *L)
{
	int i=0;
	LNode *p;
	p=L;
	while (p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
 }
  
 //单链表的插入
 LNode* insertheadList(struct LNode* L,int i,Book b)
 {
     LNode *s,*p;
 	p=L;
 	int j=0;
     if (i<=0)
    {
    	printf("插入越界!\n");
 	    exit(1);
    }
     while (p->next!=NULL)
    {
 		if (j==i-1)
	    {
 	    	s=(LNode*)malloc(sizeof(LNode));
 	 	    s->data=b;
 	    	s->next=p->next;
 		    p->next=s;
 		    printf("inserheadList函数执行,在第%d个位置插入了元素\n",j+1);
 	    	break;
       }
 	   p=p->next;
 	   j++;
    }
	return L;
  } 
  
//单链表查询
Book search(struct LNode*L,int i)
{
	int j;
	Book b;
	LNode *p;
	p=L;
	if (i<0)
	{
	   printf("查询的节点越界了!");
		exit(1); 
	}
	j=1;
    while (p->next!=NULL)
    {
   	    p=p->next;
   	    if (j==i)
	   {
   	    	b=p->data;
   	    	break;
	   }
   	    j++;
    }
	return b;
} 

//单链表的删除
Book DelList(struct LNode*L,int i)
{
	Book book;
	LNode *s,*p;
	p=L;
	int j;
	if (i<1)
	{
		printf("删除越界!\n");
		exit(1);
	}
	j=0;
	while (p->next!=NULL)
	{
		
		if (j==i-1)
		{
			s=p->next;
			book=s->data;
			p->next=s->next;
			printf("删除第%d个节点成功,删除的值为:name:%s,code:%s,price:%d\n",s->data.name,s->data.code,s->data.price);
			free(s);
		}
	  	p=p->next;
		j++;
	}
	return book;
 } 
void main()
{
    LNode L,*Q; 
    Book b;
    int i;
    Q=&L;
 
    InitLNode(&L);
    L=*creatList();
    printf("请输入书本的name,code和price:\n");
    scanf("%s%s%f",&b.name,&b.code,&b.price);
    insertheadList(&L,1,b);
    int y=length(&L);
    printf("单链表的length:%d\n",y);
//删除第一个元素
    Q=&L;
   Book book= DelList(Q,1); 
   printf("删除了第1个元素,它的name:%s,code:%s,price:%f\n",Q->data.name,Q->data,Q->data.price);
  
  //按链表的存储顺序输出 
     i=1;
     while (Q->next!=NULL)
    {
         Book book=search(&L,i);
         Q=Q->next;
  	    printf("name:%s,code:%s,price:%f\n",Q->data.name,Q->data.code,Q->data.price);
  	     i++;
    }
  
}
问题补充:

注释掉函数中的输出语句后能正确删除,但是不能显示删除掉的元素

云雨归海的主页 云雨归海 | 初学一级 | 园豆:187
提问于:2021-04-04 19:55
< >
分享
最佳答案
0

原因是变量名与结构体变量名重名

云雨归海 | 初学一级 |园豆:187 | 2021-04-05 15:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册