| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 811 人关注过本帖
标题:删除链表,有问题,求指导
只看楼主 加入收藏
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
收藏
得分:0 
回复 10楼 crystall
//找到该学生
            if(*per == pa->num)
            {
                if(pPrev == NULL)
                {
                    free(pa);//释放内存
                    head = pa = NULL;
                }
                else
               
感觉这里有些不妥哈,  if(pPrev == NULL) 这条语句大概意思是找到的学生位于头结点位置, 但是删除头结点的同时并没有指定下一个头结点。


打好基础,学会站在巨人的肩膀上!
2013-01-05 11:51
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
收藏
得分:0 
说错了, 首先上面的意图是判断找到的学生在头节点里, 但是学生的信息也不能安排在头节点head .安排在头节点里意味着要删除头节点。 头节点都删除了, 那样后面的节点便找不到了。

打好基础,学会站在巨人的肩膀上!
2013-01-05 12:00
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:0 
回复 12楼 wengege
嗯,嗯,说的是。
程序代码:
int Delete(struct stud *head, int* per)
{
    int y = 0;
    struct stud * pa = head;
    struct stud * pPrev = NULL;


    if(*per == 0)
    {
        printf("学生的学号不能为0\r\n");
        y=0;
        return y;
    }

    //头节点的下一个结点为空,链表不为空.(有头节点这个元素)
    //如果头节点为空,链表则为空.
    if (head == NULL)
    {
        printf("链表为空!!!");
        y=0;
        return y;
    }
    else
    {
        //1 -> [2] -> 3
        while(pa != NULL)
        {
            //找到该学生
            if(*per == pa->num)
            {
                if(pPrev == NULL)
                {
                    head = pa->next;
                    free(pa);//释放内存
                    pa = NULL;
                   
                }
                else
                {
                    pPrev->next = pa->next;
                    free(pa);//释放内存
                    pa = NULL;
                }

                y = 1;
                break;
            }

            pPrev = pa;
            pa = pa->next;
        }
    }

    return y;
}


2013-01-05 13:08
chen1204019
Rank: 1
来 自:广东
等 级:新手上路
帖 子:93
专家分:0
注 册:2012-12-3
收藏
得分:0 
回复 8楼 mutouren123
我不太懂,学到链表就好难理解了

新手发言,请多指教!
2013-01-05 13:29
chen1204019
Rank: 1
来 自:广东
等 级:新手上路
帖 子:93
专家分:0
注 册:2012-12-3
收藏
得分:0 
回复 13楼 crystall
当删除头链表时再输出声下的链表会出现乱码

新手发言,请多指教!
2013-01-05 15:26
wengege
Rank: 2
等 级:论坛游民
帖 子:148
专家分:93
注 册:2012-7-23
收藏
得分:0 
最近也开始接触的链表,晚上写了个双链表的操作。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>


typedef struct NODE {
        struct NODE *fwd;
        struct NODE *bwd;
        int            value;

} Node;
 
bool Dll_Insert(Node * , int );
Node * Creat_List(void);
void Traverse_List( Node *);

int main(void)
{
    Node * rootp;
    bool succeed;

    rootp = Creat_List();
    Traverse_List( rootp );
        succeed = Dll_Insert( rootp, 45);
    if ( succeed )
        Traverse_List( rootp );
    else
        printf("节点插入失败!");

    return 0;
}

void Traverse_List( Node * rootp)
{   
    Node * nodep = rootp->fwd ;

    printf( "当前链表值是: ");
    while( NULL != nodep )
    {
        printf( "%d ", nodep->value);
        nodep = nodep->fwd ;
    }
    printf( "\n");


}

// 回忆根节点作为参数的
Node * Creat_List(void)
{   
    int  node_num = 0;
    Node *root_node;
    Node *tmp_node;
    Node *new_node;

    while ( node_num <= 0)
    {
        printf( "请输入要生成的节点数: " );
        scanf( "%d", &node_num);
    }

    root_node = tmp_node = ( Node *)malloc( sizeof(Node) );
    tmp_node->bwd = tmp_node->fwd = NULL;
    if ( NULL == tmp_node )
    {
        printf("内存分配错误!");
        exit( -1 );
    }

    while ( node_num > 0 )
    {
        new_node = ( Node *)malloc( sizeof(Node) );
        if ( NULL == tmp_node )
        {
            printf("内存分配错误!");
            exit( -1 );
        }
        printf("请为新的节点分配数据:");
        scanf( "%d", &new_node->value );

        if ( NULL == tmp_node->fwd )
            new_node->bwd = NULL; //生成的第一个节点的F,B指针都为NULL。
        else
            new_node->bwd = tmp_node; //其他节点的B指针指向前一次生成的节点,F指针设置NULL
        new_node->fwd = NULL;
        tmp_node->fwd = new_node;
        tmp_node = new_node;
        root_node->bwd = new_node;
        --node_num ;
    }
   
    return root_node;
}


bool Dll_Insert( Node * rootp, int value)
{
    Node *this_;
    Node *next;
    Node *newnode;
   
    for( this_ = rootp; NULL != (next = this_->fwd); this_ = next)
    {
        if( next->value == value )
            return false; //不插入已有的值
        if( next->value > value)
            break;
    }

    newnode = (Node *)malloc( sizeof( Node ) );
    if( NULL == newnode)
        return false;
    newnode->value = value;
    /*
    *把新节点插入到链表中
    */
    newnode->fwd = next;
    this_->fwd = newnode;

    if( this_ != rootp)
        newnode->bwd = this_;
    else
        newnode->bwd = NULL;

    if( NULL != next )
        next->bwd = newnode;
    else
        rootp->bwd = newnode;

    return true;

}

打好基础,学会站在巨人的肩膀上!
2013-01-06 11:29
chen1204019
Rank: 1
来 自:广东
等 级:新手上路
帖 子:93
专家分:0
注 册:2012-12-3
收藏
得分:0 
回复 16楼 wengege
我才刚学到链表,还没详细学

新手发言,请多指教!
2013-01-06 15:54
ksddah
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:53
专家分:135
注 册:2012-12-11
收藏
得分:0 
链表删除节点用指针的指针阿, Delete(struct stud *head, int* per)改为Delete(struct stud **head, int* per),不然,Delete修改了头指针,但原函数的头指针还是原来的值。
程序代码:
/*
学生信息删除函数,删除指定学号的学生信息,
传递给该函数的实参是所建立的单链表的头指针L、要删除的学生学号。
若删除成功,返回值为1,否则,返回值为0。
*/
#include<stdio.h>
#include<stdlib.h>
#define N 2

typedef struct stud
{
    int num;
    char name[10];
    float score[N+1];
    struct stud *next;
}NODE;

NODE *create();
int Delete(NODE **p_head, int *per);
void print(NODE *head);

//主函数
int main()
{
    NODE *L;
    int n=1, i;
    L=create();
    print(L);
    //printf("请输入要删除学生的学号:\n");
    //scanf("%d\n", &n);
    i=Delete(&L, &n);
    print(L);
    printf("i=%d\n", i);
    return 0;
}

NODE *create()               //创建链表,返回表头指针
{
    NODE *head,*p,*q;
    int i;
    head=(NODE *)malloc(sizeof(NODE));
    p=head;
    for(i=1;i<N;i++)
    {
        printf("请依次输入第%d个学生的学号、姓名、分数(以空格键隔开):\n",i);
        scanf("%d %s",&p->num,p->name);
        for(int k=0;k<N+1;k++)
        scanf("%f",&p->score[k]);
        q=(NODE *)malloc(sizeof(NODE));
        p->next=q;
        p=p->next;
    }
    printf("请依次输入第%d个学生的学号、姓名、分数(以空格键隔开):\n",i);
    scanf("%d %s",&p->num,p->name);
    for(int r=0;r<N+1;r++)
    scanf("%f",&p->score[r]);
    p->next=NULL;
    return head;
}

//学生信息删除函数,删除指定学号的学生信息
int Delete(NODE **p_head, int *per)
{
    NODE *p,*q;
    p=*p_head;
    if(p==NULL)         //空指针,删除失败,返回0
    return 0;
    if(p->num==*per)    //删除节点在头指针处
    {
        *p_head=p->next;
        free(p);
        return 1;
    }
    else
    {
        while(p->num!=*per&&p->next!=NULL)
        {
            q=p;
            p=p->next;
        }
        if(p->num==*per)      //已找到,删除该节点
        {
            q->next=p->next;
            free(p);
            return 1;
        }
        else              //链表中不存在指定学号的学生
           return 0;
    }
}

void print(NODE *head)    //输出链表中信息
{
    NODE *p;
    p=head;
    if(p==NULL)
       printf("该链表为空!");
    else
    {
        while(p->next!=NULL)
       {
          printf("姓名:%s\n 学号:%d\n",p->name,p->num);
          for(int j=0;j<N+1;j++)
          printf("分数:%4f",p->score[j]);
          printf("\n");
          p=p->next;
        }
        printf("姓名:%s\n 学号:%d\n",p->name,p->num);
        for(int j=0;j<N+1;j++)
        printf("分数:%4f",p->score[j]);
        printf("\n");
    }
}

2013-01-06 16:27
快速回复:删除链表,有问题,求指导
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017569 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved