这是看完一本算法书,凭理解敲得程序,结果有好多错误,理解不到位,表明错误处,给自己警戒,总结易犯错误
#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);
}
}