鱼C论坛

 找回密码
 立即注册
查看: 4496|回复: 15

链表问题????????????

[复制链接]
发表于 2013-3-26 17:23:20 | 显示全部楼层 |阅读模式
5鱼币
#include <stdio.h>
#include <stdlib.h>
struct lian
{
        int data;
        struct lian *next;
};
typedef struct lian LIST;
LIST *getdat()
{
        LIST *h,*s,*p;
        int x;
        h=(LIST *)malloc(sizeof(LIST));
        p=h;
        scanf("%d",&x);
        while(x!=-1)
        {
                p->data=x;
                s=(LIST *)malloc(sizeof(LIST));
                p->next=s;
                p=s;
                scanf("%d",&x);
        }
        p->next=NULL;
        return h;
}
void printdat(LIST *h)
{
       
                printf("HEAD");
        while(h->next!=NULL)
                {
                        printf("->%d",h->data);
                        h=h->next;
                }
               

        printf ("END\n");
}
deldat (LIST *h)                                                  //运行到这儿就程序出错,高手帮忙看下
{
        LIST *p;
        int x;
        scanf("%d",&x);                                                      
        p=h->next;
        while (p->data!=x||p->next!=NULL)
        {
                h=p;
                p=p->next;
        }
        if (p->data==x)
                h->next=p->next;
}
main ()
{
        LIST *head;
        head=getdat();
        printdat(head);
        deldat(head);
        printdat(head);
        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-26 18:27:51 | 显示全部楼层
while (p->data!=x || p->next!=NULL)改成while (p->data!=x&&p->next!=NULL)
还有while前的p = h->next,因为p开始就是指向队列的第二个元素,所以如果要删除的是队首元素时没办法找到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 18:53:19 | 显示全部楼层
del函数里面错误挺多,改过的代码:
#include <stdio.h>
#include <stdlib.h>
struct lian
{
        int data;
        struct lian *next;
};
typedef struct lian LIST;
LIST *getdat()
{
        LIST *h,*s,*p;
        int x;
        h=(LIST *)malloc(sizeof(LIST));
        p=h;
        scanf("%d",&x);
        while(x!=-1)
        {
                p->data=x;
                s=(LIST *)malloc(sizeof(LIST));
                p->next=s;
                p=s;
                scanf("%d",&x);
        }
        p->next=NULL;
        return h;
}
void printdat(LIST *h)
{
        
                printf("HEAD");
        while(h->next!=NULL)
                {
                        printf("->%d",h->data);
                        h=h->next;
                }
                

        printf ("END\n");
}
void deldat (LIST **h)                                                  //运行到这儿就程序出错,高手帮忙看下
{
        LIST *p;
        int x;
        scanf("%d",&x);                                                      
        p=*h;
        while (p->data!=x&&p->next!=NULL)
        {
                p=p->next;
        }
        if (p->data==x) 
                {
                        p->data = p->next->data;
                        p->next = p->next->next;
                }
}
int main ()
{
        LIST *head;
        head=getdat();
        printdat(head);
        deldat(&head);
        printdat(head);
                flushall();
                getchar();
        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 18:56:17 | 显示全部楼层
3个元素的链表
1、删除第一个:
1.jpg
2、删除中间:
2.jpg
3、删除最后一个:
3.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 19:03:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 19:12:49 | 显示全部楼层
楼上的兄弟已经给你答案了,我给些建议吧~在主函数中定义的*head最好定义成head~这样传指针的时候,不用两层的指针·
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 20:01:18 | 显示全部楼层
SXDA 发表于 2013-3-26 19:03
请教一下,void deldat(LIST **h)中“  **h  ”是什么意思?

就是指针的指针的意思。如果单传指针是没用的,那是值传递。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-27 07:48:34 | 显示全部楼层

RE: 链表问题????????????

小新110 发表于 2013-3-26 20:01
就是指针的指针的意思。如果单传指针是没用的,那是值传递。

一般不是直接传指针就可以的吗。这样有什么优点或必要性?(第一次看到这种情况,还望指教哈~)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-27 17:51:27 | 显示全部楼层
小新110 发表于 2013-3-26 18:53
del函数里面错误挺多,改过的代码:

问题解决了,在学习改过的代码:lol
还有就是没有说原代码在哪步出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-3-27 17:54:57 | 显示全部楼层
SXDA 发表于 2013-3-26 18:27
while (p->data!=x || p->next!=NULL)改成while (p->data!=x&&p->next!=NULL)
还有while前的p = h->next,因 ...

嗯,那个是我写错了,原来是&&的。它出错不是我要删除第一个元素时出错,在输入x值时程序就跳出错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-27 21:52:44 | 显示全部楼层
好像很厉害的箱子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-28 12:23:27 | 显示全部楼层
akon 发表于 2013-3-26 19:12
楼上的兄弟已经给你答案了,我给些建议吧~在主函数中定义的*head最好定义成head~这样传指针的时候,不用两层 ...

如何定义head的话,在建立链表的时候如何返回一个地址 ??????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-28 12:32:43 | 显示全部楼层
小新110 发表于 2013-3-26 18:53
del函数里面错误挺多,改过的代码:

#include <stdio.h>
#include <stdlib.h>
struct ndd
{
        int data;
        struct ndd *next;
};
typedef struct ndd LIST;
LIST *creatd()
{
        LIST *h,*p,*s;
        int c;
        h=(LIST *)malloc(sizeof(LIST));;
        p=h;
        scanf ("%d",&c);
        while (c!=-1)
        {
                s=(LIST *)malloc(sizeof(LIST));
                p->data=c;
                p->next=s;
                p=s;
                scanf("%d",&c);
        }
        p->next=NULL;
        return h;
}
printd(LIST *h)
{
        while(h->next!=NULL)
        {
                printf ("->%d",h->data);
                h=h->next;
        }
        printf ("END\n");
}
deld(LIST *p)
{
    int x;
        scanf ("%d",&x);
        while (p->data!=x&&p->next!=NULL)
        {
                p=p->next;
        }
        if (p ->data==x)
        {
                p->data=p->next->data;
                p->next=p->next->next;
        }
}
main ()
{
        LIST *head;
        head=creatd();
        printd(head);
        deld(head);
        printd(head);
        getch();
}
学习了高手的代码,试了改下,删除的时候直接传head.这样也是可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-28 22:02:57 | 显示全部楼层
csclq 发表于 2013-3-28 12:23
如何定义head的话,在建立链表的时候如何返回一个地址 ??????

定义指针,指向head
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-10 18:24:12 | 显示全部楼层
过来学习一下。。。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-17 21:39:30 | 显示全部楼层
学习了!!!!!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-15 11:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表