调试单向链表遇到问题总结

来源:互联网 发布:gps照相机软件下载 编辑:程序博客网 时间:2024/04/29 06:09

这是看完一本算法书,凭理解敲得程序,结果有好多错误,理解不到位,表明错误处,给自己警戒,总结易犯错误

#include <stdlib.h>

#include <stdio.h>
#include <string.h>


typedef struct
{
  char key[10];
  char name[20];
  int age;
}Data;                                //写成Date,跟后面定义的不一样,这个好排查一些,有错误提示


typedef struct Node
{
   Data nodeData;
   struct Node *nextNode;
}CLType;


CLType *CLAddEnd(CLType *head,Data nodeData)//追加结点
{
   CLType *node,*htemp;
   if(!(node=(CLType*)malloc(sizeof(CLType))))
   {
       printf("内存申请失败!\n");
  return NULL;
   }
   else
   {
       node->nodeData=nodeData;
  node->nextNode=NULL;
  if(head==NULL)
  {
     head=node;
 return head;
  }
  htemp=head;
  while(htemp->nextNode)
  {
     htemp=htemp->nextNode;
  }
  htemp->nextNode=node;

  return head;      

           //return node;                        return的不是head,造成只显示最后一个数据结点

   }
}


CLType *CLAddFirst(CLType *head,Data nodeData)//插入头结点
   {
      CLType *node;
 if(!(node=(CLType *)malloc(sizeof(CLType))))
 {
     printf("内存申请失败!\n");
 return NULL;
 }
 else
 {
    node->nodeData=nodeData;
node->nextNode=head;
head=node;
return head;
 }
   }


CLType *CLFindNode(CLType *head,char *key)//查找结点
   {
      CLType *htemp;
 htemp=head;
 while(htemp)     //写成if(),结果使直接返回null
 {  
    if(strcmp(htemp->nodeData.key,key)==0)
{
   return htemp;
}
    htemp=htemp->nextNode;
 }
 return NULL;
   }


CLType *CLInsertNode(CLType *head,char *findkey,Data nodeData)//中间插入结点
   {
      CLType *node,*htemp;
 if(!(node=(CLType *)malloc(sizeof(CLType))))
 {
    printf("内存申请失败!\n");
return NULL;
 }
 else
 {  
    htemp=CLFindNode(head,findkey);
printf("%s",htemp->nodeData.key);
         if(htemp)
{
   node->nodeData=nodeData;
node->nextNode=htemp->nextNode;
htemp->nextNode=node;
}
else
{
   printf("未找到插入的位置!\n");
free(node);
}
 }
 return head;
   }


int CLDeleteNode(CLType *head,char *key)//删除某结点
   {
      CLType *node,*htemp;
 htemp=head;
 node=head;
      while(htemp!=NULL)
 {     
 if(strcmp(htemp->nodeData.key,key)==0)
 {

node->nextNode=htemp->nextNode;
free(htemp);
return 1;
 }
 else
 {  
node=htemp;

htemp=htemp->nextNode;

                        /* node=htemp->nextNode;
 htemp=htemp->nextNode;        //node赋值错误,导致结点删除失败*/

 
 }
 }
 return 0;
   }


int CLLength(CLType *head)//计算链表长度
   {
      CLType *htemp;
 int length=0;
 htemp=head;
 while(htemp)
 {
    length++;
htemp=htemp->nextNode;
 }
 return length;
   }


void CLAllNode(CLType *head)
   {
      CLType *htemp;
 htemp=head;
 Data nodeData;
 printf("当前链表共有%d个结点。链表所有数据如下:\n",CLLength(head));
 while(htemp)
 {
nodeData=htemp->nodeData;
    printf("结点(%s,%s,%d)\n",nodeData.key,nodeData.name,nodeData.age);
htemp=htemp->nextNode;
 }
   }


void main()
{
   CLType *node,*head=NULL;
   Data nodeData;
   char key[10],findkey[20];
   printf("链表测试,先输入链表中的数据,格式为:关键字 姓名 年龄 \n");
   do
   {
 
      fflush(stdin);
 scanf("%s",nodeData.key);


 if(strcmp(nodeData.key,"0")==0)
 {
    break;//输入为0,退出
 }
 else
 {


 scanf("%s%d",nodeData.name,&nodeData.age);
 head=CLAddEnd(head,nodeData);


 }
   }while(1);
   CLAllNode(head);


   printf("\n演示插入结点,输入插入位置关键字:");
   scanf("%s",findkey);
   //printf("%s",findkey);
   printf("输入插入结点的数据(关键字 姓名 年龄)");
   scanf("%s%s%d",nodeData.key,nodeData.name,&nodeData.age);
   head=CLInsertNode(head,findkey,nodeData);
   CLAllNode(head);


   printf("\n演示删除结点,输入删除位置关键字:");
   fflush(stdin);
   scanf("%s",key);
   //printf("%s",key);
   CLDeleteNode(head,key);
   CLAllNode(head);


   printf("\n演示在链表中查找结点,输入查找关键字:");
   fflush(stdin);
   scanf("%s",key);
   node=CLFindNode(head,key);
   if(node)
   {
      nodeData=node->nodeData;
 printf("关键字%s对应结点为(%s,%s,%d)\n",key,nodeData.key,nodeData.name,&nodeData.age);
   }
   else
   {
      printf("在链表中未找到关键字为%s的结点!\n",key);
   }

}


原创粉丝点击