简单小程序 求帮助啊 (关于删除链表的结点)

zhishiheng 2012-05-16 04:12:05

#include "stdio.h"
#include "malloc.h"
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//构造一个链表
bool CreatList(LinkList &L)
{
int x;
L=(LinkList)malloc(sizeof(LNode));
scanf("%d",&x);
LNode *r=L,*s;
while(x!=999)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return true;
}
//删除链表中最小结点
LinkList DeleteMin(LinkList &L)
{
LNode *p=L,*pre=p->next;
LNode *minp=p,*minpre=pre;
while (p!=NULL)
{
if (p->data<minp->data)
{
minp=p;
minpre=pre;
}
pre=p;
p=p->next;
}
minpre->next=minp->next;
free(minp);
return L;
}
void main()
{
LinkList L;
CreatList(L);
DeleteMin(L);
while(L->next)
{
L=L->next;
printf("%d",L->data);
}
}

为什么无法输出结果呢?说是内存空间被占用什么的。
...全文
122 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
WYJXHL97 2012-05-16
  • 打赏
  • 举报
回复
#include "stdio.h"
#include "malloc.h"

typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;

//构造一个链表
bool CreatList(LinkList &L)
{
int x;
L = NULL;
LNode *r,*s;
do{
scanf("%d",&x);
if(x == 999)
break;
s=(LinkList)malloc(sizeof(LNode));
if(L == NULL)
{
L = s;
r = L;
}
s->data=x;
r->next=s;
r=s;
}while(1);

r->next=NULL;
return true;
}

//删除链表中最小结点
LinkList DeleteMin(LinkList &L)
{
LNode *p=L;
LNode *minp=p,*minpre=p;
while ((p != NULL)&&(p->next != NULL))
{
if(minp->data > p->next->data)
{
minp = p->next;
minpre = p;
}
p = p->next;
}
minpre->next = minp->next;
if(minp == L)
L = minp->next;
free(minp);
return L;
}

void main()
{
LinkList L = NULL;
printf("input\n");
CreatList(L);
DeleteMin(L);
printf("output:\n");
while(L)
{
printf("%d\n",L->data);
L=L->next;
}
}

create链表就不对,delete的时候问题就更多了,lz自己对比一下吧。
链表的要好好学习一下,很重要。
zhishiheng 2012-05-16
  • 打赏
  • 举报
回复
尼玛 我就是送分的!艹
zhishiheng 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

楼主,你要输入999结束吧
[/Quote]
是要输入999结束 我的问题跟这个无关啊

是ox44o1205指令引用的oxdddddddd内存。改内存不能为read.
hen_hao_ji 2012-05-16
  • 打赏
  • 举报
回复
楼主,你要输入999结束吧
zhishiheng 2012-05-16
  • 打赏
  • 举报
回复
补充:比如说 我输入 12345 结果应该是2345 但是无法显示结果
数据结构源码C语言描述续,本篇描述了二叉树三叉链表结构及其操作,以及测试程序: //创建二叉树结点 TriTreeNode *CreateTriTreeNode(char data); //给二叉树添加结点,用于创建二叉树 int AddTriTreeNode(char data, TriTreeNode *newTriNode); //创建二叉树 TriTreeNode *CreateTriTree(); //计算二叉树的高度 int GetTriTreeDepth(TriTreeNode *triTree); //插入结点(连接两棵二叉树),这个结点(二叉树)和root不相交; //newTriNode可以是一个结点也可以是一棵二叉树 int InsertChildTriNode(TriTreeNode *newTriNode, TriTreeNode *root); //获取根结点 TriTreeNode *GetTriTreeRoot(TriTreeNode *triTree); //判断二叉树是否为空 int IsTriTreeEmpty(TriTreeNode *triTree); //获取二叉树中某一个结点的左孩子结点 void GetLeftChildFromTriTree(TriTreeNode *triTree, TriTreeNode *triNode, TriTreeNode *lChild); //获取二叉树中某一个结点的右孩子结点 void GetRightChildFromTriTree(TriTreeNode *triTree, TriTreeNode *triNode, TriTreeNode *rChild); //获取二叉树某一个指定结点父节点 int GetTriTreeParent(TriTreeNode *root, TriTreeNode *triNode, TriTreeNode *parentNode); //删除二叉树,某一个指定结点的左或右子树 void DeleteChildFromTriTree(TriTreeNode *root, TriTreeNode *triNode, int flag); //销毁二叉树 void DestroyTriTree(TriTreeNode *TriTree); //先序遍历(DRL), 先序遍历按照既定算法遍历出来将是一个无序列表 void PreOrderTraversTriTreeDRL(TriTreeNode *TriTree); //先序遍历(DLR), 先序遍历按照既定算法遍历出来将是一个无序列表 void PreOrderTraversTriTreeDLR(TriTreeNode *TriTree); //中序遍历(LDR),遍历结果应该是一个从小到大的有序排列 void InOrderTraversTriTreeLDR(TriTreeNode *TriTree); //中序遍历(RDL),遍历结果是一个从大到小的有序排列 void InOrderTraversTriTreeRDL(TriTreeNode *triTree); //后续遍历(LRD) void PostOrderTraversTriTreeLRD(TriTreeNode *TriTree); //后续遍历(RLD), void PostOrderTraversTriTreeRLD(TriTreeNode *TriTree);
【资源说明】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【项目介绍】 C++课程作业-基于Qt实现的链表操作演示系统源码(含详细注释+报告).zip 1.1 题目 分别以单链表、循环链表、双向链表为例,实现线性表的建立、插入、删除、查找等基 本操作。 要:能够把建立、插入、删除等基本操作的过程随时显示输出来。 1.2 软件功能 对于单链表、循环链表和双向链表,均能实现以下功能: (1)线性表的建立,建立一个带头结点的空链表; (2)线性表插入操作,输入插入索引与插入元素值,将元素插入到链表指定位置; (3)线性表删除操作,输入删除元素的索引,删除该位置的元素; (4)线性表查找操作,输入要查找的元素值,返回第一个等于该值得元素索引; (5)线性表修改操作,输入要修改的索引与修改后的值,修改线性表对应元素; (6)能够对各种特殊情况如索引不合法等进行判断并给出提示。 1.3 设计思想 根据题意,需要对不同链表进行同样的几项基本操作,实现标准交互式图形界面,可以 分为算法设计和界面设计两部分。 算法设计方面:对于单链表,本程序链表的建立采用带头结点方式,即每次建立链表都 动态申请一个头结点,头结点的后继是 NULL;链表的插入操作需要从头遍历链表,在指定 索引处修改插入位置前驱结点的 next 指针指向新结点,新结点的 next 指针则指向该位置原 结点链表删除操作同样需要从头遍历链表,将指定索引处结点的前驱结点的 next 指针 修改为指向该结点的后继结点,并删除当前结点即可;链表的查找操作需要从头遍历链表比 较当前访问元素与要查找元素是否相等,若相等则返回索引,若访问完整个链表都找不到相 同的元素,则提示查找失败;链表修改操作无需改变链表长度,从头遍历链表找到对应位置 元素修改其值即可。循环链表和双向链表的相关操作基本同单链表,不同的是循环链表最后 一个结点的 next 指针指向头结点,双向链表除了指向元素后继的 next 指针还有指向元素前 驱的 prior 指针。三种链表的实现有所不同,但对于本程序的场景体现不出三种链表的差异。 界面设计方面:可以利用 QT 框架添加按钮、选择框、文本展示框等控件,将三种链表 的五项基本操作整合到一个界面中。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧