鱼C论坛

 找回密码
 立即注册
查看: 3680|回复: 3

求助函数的问题!

[复制链接]
发表于 2012-10-26 21:49:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大哥,大姐,求助啊!!一下是小弟写的数据结构中关于链表的实现,可是却遇到了一个问题,就是delete_list函数的问题!尝试了好几次但是始终没有找到到底是为什么大家帮忙看看!
  1. # include <stdio.h>
  2. # include <malloc.h>
  3. # include <stdlib.h>

  4. typedef struct Node
  5. {
  6.         int date;
  7.         struct Node * pNext;
  8. }*PNODE, NODE;

  9. PNODE Create_list(void);
  10. void Show_list(PNODE pHead);
  11. void sort_list(PNODE pHead);
  12. int Length(PNODE pHead);
  13. void empty_list(PNODE pHead);
  14. void insert_list(PNODE pHead);
  15. void delete_list(PNODE pHead);

  16. void Show_list(PNODE pHead)
  17. {
  18.         PNODE p = pHead->pNext;
  19.         while (NULL != p)
  20.         {
  21.                 printf("%3d", p->date);
  22.                 p = p->pNext;
  23.         }
  24.         printf("\n");
  25.        
  26.         return ;
  27. }


  28. int Length(PNODE pHead)
  29. {
  30.         int len = 0;
  31.         PNODE p = (PNODE)malloc(sizeof(NODE));
  32.         p = pHead;
  33.         while (NULL != p->pNext)
  34.         {
  35.                 ++len;
  36.                 p = p->pNext;
  37.         }
  38.         return len;
  39. }

  40. void sort_list(PNODE pHead)
  41. {
  42.         int t;
  43.         int len = Length(pHead);
  44.        
  45.         PNODE p = pHead->pNext;
  46.         PNODE q = pHead->pNext;
  47.        
  48.         for (p; NULL!=p; p=p->pNext)
  49.                 for (q=p->pNext; NULL!=q; q=q->pNext)
  50.                 {
  51.                         if (p->date < q->date)
  52.                         {
  53.                                 t = q->date;
  54.                                 q->date = p->date;
  55.                                 p->date = t;
  56.                         }
  57.                 }
  58.                 return;                       
  59. }

  60. void empty_list(PNODE pHead)
  61. {
  62.         if (NULL == pHead->pNext)
  63.         {
  64.                 printf("空表");
  65.         }
  66.         else
  67.         {
  68.                 printf("链表的长度为%d!", Length(pHead));
  69.         }
  70. }

  71. PNODE Create_list(void)
  72. {
  73.         int len;
  74.         int val;
  75.         PNODE pHead = (PNODE)malloc(sizeof(NODE));
  76.         if (NULL == pHead)
  77.         {
  78.                 printf("分配失败!");
  79.                 exit(-1);
  80.         }
  81.        
  82.         PNODE pTail = pHead;
  83.         pTail->pNext = NULL;
  84.        
  85.         printf("Please input the length to the LIST: length = ");
  86.         scanf ("%d", &len);
  87.        
  88.        
  89.         for (int i=0; i<len; i++)
  90.         {
  91.                 printf("请输入第%d个节点的数值", i+1);
  92.                 scanf ("%d", &val);
  93.                
  94.                 PNODE pNew = (PNODE)malloc(sizeof(NODE));
  95.                
  96.                 pTail->pNext = pNew;
  97.                 pNew->date = val;
  98.                 pNew->pNext = NULL;       
  99.                 pTail = pNew;
  100.         }
  101.        
  102.         return pHead;       
  103. }

  104. void insert_list(PNODE pHead, int pos, int num )
  105. {
  106.         PNODE p = pHead;
  107.        
  108.         for (int i=0; i<pos-1&&NULL != p;)
  109.         {
  110.                 p = p->pNext;
  111.                 i++;
  112.         }
  113.        
  114.         PNODE pDate = (PNODE)malloc(sizeof(NODE));
  115.        
  116.         if (NULL == pDate)
  117.         {
  118.                 printf("分配失败!退出程序!");
  119.                 exit(-1);
  120.         }
  121.        
  122.         pDate->date = num;
  123.         pDate->pNext = p->pNext;
  124.         p->pNext = pDate;
  125.        
  126.         return ;
  127. }

  128. void delete_list(PNODE pHead, int pos, int * val)
  129. {
  130.                 printf("请输入要删除的位置:pos:");
  131.                 scanf("%d", &pos);
  132.                 PNODE p = pHead;

  133.                 for (int i=0 ; i<pos-1&&NULL != p->pNext; i++)
  134.                 {
  135.                         p=p->pNext;       
  136.                 }

  137.         *val = p->pNext->date;
  138.         p->pNext = p->pNext->pNext;
  139.         free(p->pNext);
  140.         p->pNext = NULL;

  141.         return ;
  142. }


  143. int main (void)
  144. {
  145.         int pos, num;
  146.         int val;
  147.         PNODE pHead = (PNODE)malloc(sizeof(NODE));
  148.        
  149.         pHead = Create_list();
  150.        
  151.         empty_list(pHead);
  152.        
  153.         int len = Length(pHead);
  154.         printf("%d\n", len);
  155.        
  156.         Show_list(pHead);
  157.         sort_list(pHead);
  158.         Show_list(pHead);

  159.         printf("输入插入位置及插入值:");
  160.         scanf("%d %d", &pos, &num );
  161.        
  162.         insert_list(pHead, pos, num );
  163.         Show_list(pHead);

  164.         delete_list(pHead, pos, &val);
  165.         printf("\n%d", val);
  166.         Show_list(pHead);

  167.         return 0;
  168. }
复制代码
这个整体应该没有什么问题!主要是delete_list()的问题!
  1. void delete_list(PNODE pHead, int pos, int * val)    //val作为删除的那个数据的返回值
  2. {
  3.                 printf("请输入要删除的位置:pos:");
  4.                 scanf("%d", &pos);
  5.                 PNODE p = pHead;

  6.                 for (int i=0 ; i<pos-1&&NULL != p->pNext; i++)
  7.                 {
  8.                         p=p->pNext;       
  9.                 }

  10.         *val = p->pNext->date;
  11.         p->pNext = p->pNext->pNext;
  12.         free(p->pNext);
  13.         p->pNext = NULL;

  14.         return ;
  15. }
复制代码
我不知道到底怎么了!求各位高手赐教!!!!!

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-26 22:43:55 | 显示全部楼层
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

typedef struct Node
{
        int date;
        struct Node * pNext;
}*PNODE, NODE;

PNODE Create_list(void);
void Show_list(PNODE pHead);
void sort_list(PNODE pHead);
int Length(PNODE pHead);
void empty_list(PNODE pHead);
void insert_list(PNODE pHead);
void delete_list(PNODE pHead);

void Show_list(PNODE pHead)
{
        PNODE p = pHead->pNext;
        while (NULL != p)
        {
                printf("%3d", p->date);
                p = p->pNext;
        }
        printf("\n");
        
        return ;
}


int Length(PNODE pHead)
{
        int len = 0;
        PNODE p = (PNODE)malloc(sizeof(NODE));
        p = pHead;
        while (NULL != p->pNext)
        {
                ++len;
                p = p->pNext;
        }
        return len;
}

void sort_list(PNODE pHead)
{
        int t;
        int len = Length(pHead);
        
        PNODE p = pHead->pNext;
        PNODE q = pHead->pNext;
        
        for (p; NULL!=p; p=p->pNext)
                for (q=p->pNext; NULL!=q; q=q->pNext)
                {
                        if (p->date < q->date)
                        {
                                t = q->date;
                                q->date = p->date;
                                p->date = t;
                        }
                }
                return;                        
}

void empty_list(PNODE pHead)
{
        if (NULL == pHead->pNext)
        {
                printf("空表");
        }
        else
        {
                printf("链表的长度为%d!", Length(pHead));
        }
}

PNODE Create_list(void)
{
        int len;
        int val;
        PNODE pHead = (PNODE)malloc(sizeof(NODE));
        if (NULL == pHead)
        {
                printf("分配失败!");
                exit(-1);
        }
        
        PNODE pTail = pHead;
        pTail->pNext = NULL;
        
        printf("Please input the length to the LIST: length = ");
        scanf ("%d", &len);
        
        
        for (int i=0; i<len; i++)
        {
                printf("请输入第%d个节点的数值", i+1);
                scanf ("%d", &val);
               
                PNODE pNew = (PNODE)malloc(sizeof(NODE));
               
                pTail->pNext = pNew;
                pNew->date = val;
                pNew->pNext = NULL;        
                pTail = pNew;
        }
        
        return pHead;        
}

void insert_list(PNODE pHead, int pos, int num )
{
        PNODE p = pHead;
        
        for (int i=0; i<pos-1&&NULL != p;)
        {
                p = p->pNext;
                i++;
        }
        
        PNODE pDate = (PNODE)malloc(sizeof(NODE));
        
        if (NULL == pDate)
        {
                printf("分配失败!退出程序!");
                exit(-1);
        }
        
        pDate->date = num;
        pDate->pNext = p->pNext;
        p->pNext = pDate;
        
        return ;
}

void delete_list(PNODE pHead, int * val)
{
                                int pos;
                printf("请输入要删除的位置:pos:");
                scanf("%d", &pos);
                PNODE p = pHead;

                for (int i=0 ; i<pos-1&&NULL != p->pNext; i++)
                {
                        p=p->pNext;        
                }
                PNODE r = p->pNext;
        *val = r->date;
        p->pNext = r->pNext;
        free(r);

        return ;
}


int main (void)
{
        int pos, num;
        int val;
        PNODE pHead =  Create_list();
        
        empty_list(pHead);
        
        int len = Length(pHead);
        printf("%d\n", len);
        
        Show_list(pHead);
        sort_list(pHead);
        Show_list(pHead);

        printf("输入插入位置及插入值:");
        scanf("%d %d", &pos, &num );
        
        insert_list(pHead, pos, num );
        Show_list(pHead);

        delete_list(pHead, &val);
        printf("\n%d\n", val);
        Show_list(pHead);

        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-27 10:37:33 | 显示全部楼层

请问为什么我这样写是错误的呢?你是将p->pNext的值付给r,就是用r代替了p->pNext但是并没有什么实质性的改变啊!为什么我的不可以呢??求解!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-28 22:46:33 | 显示全部楼层
p->pNext = NULL;

有问题,没有此句。把p的指针域设为空。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-2-10 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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