zoukankan      html  css  js  c++  java
  • 单链表创建链表出现问题

    单链表创建链表出现问题,一开始以为是length函数有错,但是排查不出来,经过博客问答,知到了问题的根本原因,随便还改正了代码混乱的毛病

    博问链接: https://q.cnblogs.com/q/134034/

    错误代码:

    #include<stdio.h>
    #include<stdlib.h>
    //定义单链表的数据类型
    typedef struct book{
    	char name[10];
    	int code;
    	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时建表完成,该值不接入链表
    ");
    	scanf("%s%d%f",&c.name,&c.code,&c.price); 
    	while(c.price>0){
    		s=(LNode*)malloc(sizeof(LNode));
    		p->data=c;
    		s->next=p->next;
    		p->next=s;
    		printf("请输入书名,编码和价格:
    ");
    		scanf("%s%d%f",&c.name,&c.code,&c.price); 
    	}
    	printf("creatList函数执行,创建链表成功
    ");
    	return head;
    	 
    }
    //单链表的长度
    int length(LNode *L)
    {
    	int i=0;
    	LNode *p;
    	p=L;
    	while(p->next!=NULL){
    		i++;
    		p=p->next;
    		
    	}
    	return i;
     } 
     //单链表的插入
     LNode* insertheadList(LNode* L,int i,Book b)
     {
     LNode *s,*p;
     	p=L;
     	int j=0;
     if(i<=0){
     	printf("插入越界!
    ");
     	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个位置插入了元素
    ",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;
     } 
    void main()
    {
      LNode L,*Q; 
      Q=&L;
      int i;
      InitLNode(&L);
      creatList();
      Book b;
     printf("请输入书本的name,code和price:
    ");
     scanf("%s%d%f",&b.name,&b.code,&b.price);
      insertheadList(&L,1,b);
      //测试出length()函数有问题 
      printf("zzzzzzzzzzzzzzzzz
    ");
      int y=length(&L);
      printf("length:%d
    ",y);
      printf("qqqqqqqqqqqqqqqqqqq
    ");
      
      //按链表的存储顺序输出 
      i=1;
      while(Q->next!=NULL){
      Book book=search(&L,i);
         Q=Q->next;
      	printf("name:%s,code:%d,price:%f
    ",Q->data.name,Q->data.code,Q->data.price);
      	i++;
      }
      
    }
    

    根据https://q.cnblogs.com/q/134034/ 纠正后的代码:

    #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时建表完成,该值不接入链表
    ");
        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("请输入书名,编码和价格:
    ");
    		scanf("%s%s%f",&c.name,&c.code,&c.price); 
    	}
    	printf("creatList函数执行,创建链表成功
    ");
    	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("插入越界!
    ");
     	    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个位置插入了元素
    ",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;
    } 
    
    void main()
    {
        LNode L,*Q; 
        Book b;
        int i;
        Q=&L;
     
        InitLNode(&L);
        L=*creatList();
        printf("请输入书本的name,code和price:
    ");
        scanf("%s%s%f",&b.name,&b.code,&b.price);
        insertheadList(&L,1,b);
        int y=length(&L);
        printf("单链表的length:%d
    ",y);
      
      //按链表的存储顺序输出 
         i=1;
         while (Q->next!=NULL)
        {
             Book book=search(&L,i);
             Q=Q->next;
      	    printf("name:%s,code:%s,price:%f
    ",Q->data.name,Q->data.code,Q->data.price);
      	     i++;
         }
      
    }
    
  • 相关阅读:
    .NET 压缩解压库发布,支持进度查看
    WPF 蒙罩层 LoadingPage
    WPF如何用TreeView制作好友列表、播放列表
    WPF多线程UI更新——两种方法
    .NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证
    .NET单例模式-------各种写法&&验证
    迭代器模式和组合模式混用
    正确理解DTO、值对象和POCO
    理解POCO
    VM
  • 原文地址:https://www.cnblogs.com/glory-yl/p/14615686.html
Copyright © 2011-2022 走看看