| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 576 人关注过本帖
标题:我建立的循环链表删除操作出现错误!请大神就错~
只看楼主 加入收藏
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
结帖率:90.24%
收藏
已结贴  问题点数:20 回复次数:5 
我建立的循环链表删除操作出现错误!请大神就错~
//线性表的链式结构(改装成为循环链表)

#include<stdio.h>
#include<stdlib.h>

typedef struct Link_Node_ LinkNode;

struct Link_Node_                 //结点的公共部分
{
    LinkNode* next;
};

typedef struct Link_Array_       //动态链表的头结点,包含第一个结点的地址
{
    LinkNode header;              
    int length;
}LinkArray;

LinkArray* CreatLink()            //创建线性链表
{
    LinkArray* ret=(LinkArray*)malloc(sizeof(LinkArray));
    if(ret!=NULL)
    {
        ret->header.next=NULL;
        ret->length=0;
        puts("成功");
    }
    return ret;
}

void DestoryLink(LinkArray*link)  //摧毁线性链表
{
    free(link);
}

void ClearLink(LinkArray*link)    //清空线性链表
{
    LinkArray*slink=link;
    if(slink!=NULL)
    {
        slink->header.next=NULL;
        slink->length=0;
    }
}

int LengthLink(LinkArray*link)    //输出链表长度
{
    LinkArray*slink=link;
    if(slink!=NULL)
    {
//        printf("%d\n",slink->length);           //验证代码!
         return slink->length;
    }
}

void InsertLink(LinkArray*link,LinkNode*member,int pos)   //链表中插入元素
{
    LinkArray* slink=link;
    int ret;
    int i;
    ret=(slink!=0)&&(pos>=0)&&(member!=NULL);
    if(ret)
    {
        LinkNode* current=(LinkNode*)slink;
        for(i=0;(i<pos)&&(current->next!=NULL);i++)         //Amos此处你出错一次晓得不撒!
        {
            current=current->next;
        }
        member->next=current->next;
        current->next=member;

        if(slink->length==0)
        {
            member->next=member;
        }
        else if(pos==0)
        {
            for(i=0;i<slink->length;i++)
                current=current->next;
            current->next->next=member;
        }


        slink->length++;

    }
}

LinkNode* GetLink(LinkArray*link,int pos)
{
    LinkArray* slink=link;
    int i;
    int ret;
    LinkNode* rat;
    ret=(pos>=0)&&(slink!=NULL);      //注意下标号和查询序列的区别
    if(ret)
    {
        LinkNode* current=(LinkNode*)slink;
        for(i=0;i<pos;i++)
            current=current->next;
        
        rat=current->next;
        return rat;
    }
}

void DeleteLink(LinkArray*link,int pos)
{
    LinkArray* slink=link;
    LinkNode* first=NULL;
    LinkNode* last=NULL;
    LinkNode* current=(LinkNode*)slink;
    int i;
    int ret;
    first=slink->header.next;
    for(i=0;i<slink->length;i++)
        current=current->next;
    last=current->next;
        
    ret=(slink!=NULL)&&(pos>=0)&&(pos<slink->length);
    if(ret)
    {
        current=(LinkNode*)slink;               //此处强制类型转换使得指针由LinkArray类型指向更改为LinkNode类型,
        for(i=0;i<pos;i++)                                //主要原因为因为该链表结构为LinkArray->LinkNode->LinkNode-> ...
        {                                                 //所以我们需要保证指针每次的偏移量为LinkNode的长度。
            current=current->next;
        }
   
            current->next=current->next->next;                //注意此类赋值表达式左右表示的不同,坐标表示元素中的next指针,右边表示元素单元
            if(current->next==first)                          问题:当删除元素为第一个元素时,更换表头指向,但是输出结果却不对!
            {
                slink->header.next=current->next->next;
            }
            slink->length--;
    }                                                     
}

typedef struct Value                                      //一般数据结点内容
{
    LinkNode header;
    int v;
}Tmember;


void PrintLink(LinkArray*p)
{
    int i;
    for(i=0;i<p->length*2;i++)                           //将此输出也以函数实现!
    {
        struct Value* pv=(struct Value*)GetLink(p,i);
        printf("%d ",pv->v);
    }
    putchar('\n');
}



int main()
{
    LinkArray* p=NULL;
    Tmember v1,v2,v3,v4,v5;
    p=CreatLink();
    v1.v=1;
    v2.v=2;
    v3.v=3;
    v4.v=4;
    v5.v=5;
    InsertLink(p,(LinkNode*)&v1,0);
    InsertLink(p,(LinkNode*)&v2,0);
    InsertLink(p,(LinkNode*)&v3,0);
    InsertLink(p,(LinkNode*)&v4,0);
    InsertLink(p,(LinkNode*)&v5,0);
    PrintLink(p);
    DeleteLink(p,0);
    PrintLink(p);





    return 0;
}
//问题: 问题:当删除元素为第一个元素时,更换表头指向,但是输出结果却不对!
搜索更多相关主题的帖子: include 线性表 动态 
2015-04-20 21:25
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 

既然还有不甘心
就还没到放弃的时候~
2015-04-20 21:26
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
大神在哪里?

既然还有不甘心
就还没到放弃的时候~
2015-04-21 14:20
z_j_j_1
Rank: 4
等 级:业余侠客
威 望:1
帖 子:62
专家分:213
注 册:2015-4-4
收藏
得分:20 
回复 楼主 S140131022
current->next=current->next->next;                //注意此类赋值表达式左右表示的不同,坐标表示元素中的next指针,右边表示元素单元
            if(current->next==first)                          问题:当删除元素为第一个元素时,更换表头指向,但是输出结果却不对!
            {
                slink->header.next=current->next->next;
            }




我没从头看你的代码哦,就从你的问题注释前后开始看的。
我看到的是:你下面这条语句的current->next已经不是你要删除的那个节点的next了,而是你要删除的那个节点的next的next了,
所以,你是直接把second节点做为了头节点。漏掉了first节点。
   if(current->next==first)
2015-04-21 15:37
ruilikefeng
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-4-25
收藏
得分:0 
好复杂,坐等大神啊。
2015-04-26 01:01
ruilikefeng
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-4-25
收藏
得分:0 
为什么我用你的代码编译后,第一个结点和最后一个结点都被删除了。
更换表头指向,是指把头指针指向最后一个结点,逆序输出吗?
不好意思啊,我也正在学数据结构不是很懂,说错什么,请不要介意。
2015-04-26 01:16
快速回复:我建立的循环链表删除操作出现错误!请大神就错~
数据加载中...
 
   



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

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