鱼C论坛

 找回密码
 立即注册
查看: 5898|回复: 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;
}

小甲鱼最新课程 -> https://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开始就是指向队列的第二个元素,所以如果要删除的是队首元素时没办法找到。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 18:53:19 | 显示全部楼层
del函数里面错误挺多,改过的代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct lian
  4. {
  5.         int data;
  6.         struct lian *next;
  7. };
  8. typedef struct lian LIST;
  9. LIST *getdat()
  10. {
  11.         LIST *h,*s,*p;
  12.         int x;
  13.         h=(LIST *)malloc(sizeof(LIST));
  14.         p=h;
  15.         scanf("%d",&x);
  16.         while(x!=-1)
  17.         {
  18.                 p->data=x;
  19.                 s=(LIST *)malloc(sizeof(LIST));
  20.                 p->next=s;
  21.                 p=s;
  22.                 scanf("%d",&x);
  23.         }
  24.         p->next=NULL;
  25.         return h;
  26. }
  27. void printdat(LIST *h)
  28. {
  29.         
  30.                 printf("HEAD");
  31.         while(h->next!=NULL)
  32.                 {
  33.                         printf("->%d",h->data);
  34.                         h=h->next;
  35.                 }
  36.                

  37.         printf ("END\n");
  38. }
  39. void deldat (LIST **h)                                                  //运行到这儿就程序出错,高手帮忙看下
  40. {
  41.         LIST *p;
  42.         int x;
  43.         scanf("%d",&x);                                                      
  44.         p=*h;
  45.         while (p->data!=x&&p->next!=NULL)
  46.         {
  47.                 p=p->next;
  48.         }
  49.         if (p->data==x)
  50.                 {
  51.                         p->data = p->next->data;
  52.                         p->next = p->next->next;
  53.                 }
  54. }
  55. int main ()
  56. {
  57.         LIST *head;
  58.         head=getdat();
  59.         printdat(head);
  60.         deldat(&head);
  61.         printdat(head);
  62.                 flushall();
  63.                 getchar();
  64.         return 0;
  65. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 18:56:17 | 显示全部楼层
3个元素的链表
1、删除第一个:
1.jpg
2、删除中间:
2.jpg
3、删除最后一个:
3.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-26 19:03:30 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

就是指针的指针的意思。如果单传指针是没用的,那是值传递。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

一般不是直接传指针就可以的吗。这样有什么优点或必要性?(第一次看到这种情况,还望指教哈~)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

问题解决了,在学习改过的代码:lol
还有就是没有说原代码在哪步出错
小甲鱼最新课程 -> https://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值时程序就跳出错误
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-3-27 21:52:44 | 显示全部楼层
好像很厉害的箱子
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

如何定义head的话,在建立链表的时候如何返回一个地址 ??????
小甲鱼最新课程 -> https://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.这样也是可以的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

定义指针,指向head
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-10 18:24:12 | 显示全部楼层
过来学习一下。。。。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-17 21:39:30 | 显示全部楼层
学习了!!!!!!!!!!!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-12 18:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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