调试单向链表遇到问题总结
来源:互联网 发布: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);
}
}
- 调试单向链表遇到问题总结
- 开发中真机调试遇到的问题总结
- 调试audio遇到的问题总结
- Hbase调试时遇到的问题总结
- 单向链表操作总结
- Josephu问题 单向链表
- 单向链表翻转问题
- 单向链表逆序问题
- 总结:单向链表的逆转
- 调试dijkstra代码遇到的问题(总结)
- rk3126 平台上调试遇到的一些问题总结
- 串口调试所遇到问题,总结与借鉴
- 调试支付宝脱机认证接口遇到的问题总结
- MCU调试gprs模块遇到些问题总结如下
- OCX 调试遇到问题
- 调试遇到的问题
- 两单向链表相交问题
- 单向链表反转的问题
- uva562 - Dividing coins(简单动规)
- 【算法和数据结构】_2_顺序表
- 什么是DDOS攻击
- C语言拾遗(五):分析switch语句机制
- 栈(stack)与堆(heap)
- 调试单向链表遇到问题总结
- mini2440 安装OpenWrt 过程记录
- sourceinsight如何显示完整文件路径
- 写自己的分页控件
- 今天开学Oralce 现在坚持每天写技术文档,也就是笔记了!!
- OpenCV实现RGB颜色空间和HSI颜色空间的相互转换
- C++读书笔记之纯虚函数pure virtual function
- 在Android虚拟机中安装GooglePlayServices
- java反射