c-关于链表删除节点及打印的两个错误

问题描述

关于链表删除节点及打印的两个错误

//遍历一般线性表,删除位于键值为负节点之后的所有节点

#include
#include
#include
#include

struct example
{
int input;
struct example* next;
};
typedef struct example EXAMPLE;

void creat (EXAMPLE* head);
void remove (EXAMPLE* head);
void print (EXAMPLE* head);

int main (void)
{
EXAMPLE* head;

creat (head);

// print (head); 单独调用这个函数的话就不行,但是把源代码拷到creat中执行就行,为什么会这样?
remove(head); //这个函数有错误,但找不到哪里出错了
// print (head);

return 0;

}

//---------------creat-------------------
void creat (EXAMPLE* head)
{

EXAMPLE* p;
EXAMPLE* pre;
int      i;
int      n;

head = (EXAMPLE*)malloc(sizeof(EXAMPLE));

printf("n:  ");
scanf("%d",&n);

i = 1;
printf("input: ");
scanf("%d", &head->input);
i++;

pre = head;
for(;i <= n; i++)
{
    p = (EXAMPLE*)malloc(sizeof(EXAMPLE));
    printf("input: ");
    scanf("%d", &p->input);

    pre->next = p;
    p->next = NULL;
    pre = p;
}

//打印
p = head;
while(p)
{
    printf("%dn",p->input);
    p = p->next;
}

return;

}

//-----------------remove-----------------
void remove (EXAMPLE* head)
{
EXAMPLE* p;
EXAMPLE* pon;
EXAMPLE* pre;

//确定pon的位置
if(head->input < 0)
{
    pon = head->next;
    head->next = NULL;
}

else
{
    p = head;
     while(1)
    {
         if((p->next)->input < 0)
         {
            pon  = p->next;
            p->next = NULL;
            break;
         }

        if(!(p->next))
        {
            pon = NULL;
            break;
        }
        p = p->next;
    }
    }

//删除pon(包含在内)之后的所有节点
pre = pon;
while(pre)
{
    pre = pon->next;
    free(pon);
    pon = pre;
}

//打印
p = head;
while(p)
{
    printf("%dn",p->input);
    p = p->next;
}

return;

}

//------------print-----------------
void print (EXAMPLE* head)
{
EXAMPLE* p;

p = head;
while(p)
{
    printf("%dn",p->input);
    p = p->next;
}

return;

}

解决方案

第一,head指针的值要从 creat 函数中传出,参数必须要指向指针的指针。这是你 print 函数无效的原因,因为 head 指针的数值不对。

解决方案二:

第二,有内存泄露,创建是分配的空间,删除是没有对应的释放空间。

时间: 2025-01-24 05:12:56

c-关于链表删除节点及打印的两个错误的相关文章

c语言链表删除节点问题

问题描述 c语言链表删除节点问题 #include #define NUll 0#include struct stu{ char name[6]; int xuehao; int grade; struct stu next;};typedef struct stu STU;main(){ STU *p*p_start*p2*p_print*p_charu*p_charu2; int ixuehao; //输入 for (i=0;i { p=(STU *)malloc(sizeof(STU))

单链表-删除链表的节点出现问题

问题描述 删除链表的节点出现问题 我创建了一个链表,链表的第一个节点不是空白的.我想用free函数删除第一个节点,发现出错.删除其他的节点没有问题.不知道什么缘故. 解决方案 你的链表怎么定义的? 是 typeof struct Node { Node next; } Node * head这样定义的么? 那么你删除首节点要这么做 prehead = head; head = head->next; free(prehead); 解决方案二: 删除节点时: Node *s,*p; s=p->n

删除链表的节点,然后再查询,编号会错误

问题描述 删除链表的节点,然后再查询,编号会错误 #include #include #include #include using namespace std; typedef int datatype; typedef struct person { datatype score; char name[20]; int number; struct person *llink, *rlink; }PE; void display(PE *head) { PE *p; cout << end

c#操作XML(读XML,写XML,更新,删除节点,与dataset结合等)

xml 我用的是一种很笨的方法,但可以帮助初学者了解访问XML节点的过程. 已知有一个XML文件(bookstore.xml)如下: Corets, Eva 5.95 1.插入节点 往节点中插入一个节点:  XmlDocument xmlDoc=new XmlDocument(); xmlDoc.Load("bookstore.xml"); XmlNode root=xmlDoc.SelectSingleNode("bookstore");//查找 XmlEleme

hadoop教程(十二) HDFS添加删除节点并进行集群平衡

HDFS添加删除节点并进行hdfs balance 方式1:静态添加datanode,停止namenode方式 1.停止namenode 2.修改slaves文件,并更新到各个节点 3.启动namenode 4.执行hadoop balance命令.(此项为balance集群使用,如果只是添加节点,则此步骤不需要) ----------------------------------------- 方式2:动态添加datanode,不停namenode方式 1.修改slaves文件,添加需要增加

mongodb replica set 添加/删除节点方法

  replica set多服务器主从,添加,删除节点,肯定会经常遇到的.下面详细说明一下,添加,删除节点的2种方法. 一,利用rs.reconfig,来添加,删除节点 1,添加节点  代码如下   repmore:PRIMARY> config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:27018',priority:1}]};   //

jQuery DOM删除节点操作指南

 本章节主要介绍了jQuery中dom操作的三种删除节点的方法,即remove(),detach()和empty(),并附上示例代码,非常实用,这里推荐给小伙伴们.     下面示例可能用到如下HTML代码:   代码如下: <ul> <li title="t1">苹果</li> <li>香蕉</li> <li>橘子</li> <li>葡萄</li> <li>草莓&l

win7系统打印文件弹出 “正在删除”或是“正在打印” 提示的解决方法

  win7系统用户在使用打印机打印文件时,有时候会遇到执行"打印"任务,结果在电脑桌面任务栏右下角弹出"正在删除"或是"正在打印" 提示,遇到这种情况文件就无法正常打印了,如果是刚好有紧急文件需要打印的话,造成的影响损失是巨大的,有用户反映有时候打印机没有打印工作,电脑也会出现这样的提示.那么遇到这种情况我们应该怎么办呢?一起来了解下吧! 解决方法: 1.在Win7系统上,点击"开始"菜单; 2.在"开始"

解决win7系统中打印机显示“正在删除”或“正在打印”的方法

  打印机显示"正在删除"或"正在打印"的解决方案: 方法一. 1.点击"开始"-"运行",输入 services.msc ,打开服务列表,找到"Print Spooler"服务把它停止; 2.同样在运行对话框中输入 spool ,再打开文件夹下的"PRINTERS"文件夹,把里面的文件全部删除(里面的文件就是你在打印的东西); 3.继续"开始"-"运行&q