| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1806 人关注过本帖
标题:在双向链表中插入元素,弄了好久都不行啊,求助
只看楼主 加入收藏
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
在双向链表中插入元素,弄了好久都不行啊,求助
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
/*类型定义*/
typedef char DataType;
typedef struct Node
{
    DataType data;
    struct Node *prior;
    struct Node *next;
}DListNode,*DLinkList;
/*函数声明*/
DListNode *GetElem(DLinkList head,int i);
void PrintDList(DLinkList head);
int CreateDList(DLinkList head,int n);
int InsertDList(DLinkList head,int i,char e);
/*函数实现*/
int InitDList(DLinkList *head)
/*初始化双向循环链表*/
{
    *head=(DLinkList)malloc(sizeof(DListNode));
    if(!head)
        return -1;
    (*head)->next=*head;            /*使头结点的prior指针和next指针指向自己*/
    (*head)->prior=*head;
    return 1;
}
int CreateDList(DLinkList head,int n)
/*创建双向循环链表*/
{
    DListNode *p,*q;
    int i;
    char e;
    q=head;
    for(i=1;i<=n;i++)
    {
        printf("输入第%d个元素",i);
        e=getchar();
        p=(DListNode*)malloc(sizeof(DListNode));
        p->data=e;
        /*将新生成的结点插入到双向循环链表*/
        p->next=q->next;
        q->next=p;
        p->prior=q;
        head->prior=p;                /*这里要注意头结点的prior指向新插入的结点*/
        q=p;                        /*q始终指向最后一个结点*/
        getchar();
    }   
    return 1;
}
int InsertDList(DLinkList head,int i,char e)
/*在双向循环链表的第i个位置插入元素e。插入成功返回1,否则返回0*/
{
    DListNode *p,*s;
    p=GetElem(head,i);                /*查找链表中第i个结点*/
    if(!p)
        return 0;
    s=(DListNode*)malloc(sizeof(DListNode));
    if(!s)
        return -1;
    s->data=e;
    /*将s结点插入到双向循环链表*/
    s->prior=p->prior;
    p->prior->next=s;
    s->next=p;
    p->prior=s;
    return 1;
}
DListNode *GetElem(DLinkList head,int i)
/*查找插入的位置,找到返回该结点的指针,否则返回NULL*/
{
    DListNode *p;
    int j;
    p=head->next;
    j=1;
    while(p!=head&&j<i)
    {
        p=p->next;
        j++;
    }
    if(p==head||j>i)                /*如果要位置不正确,返回NULL*/
        return NULL;
    return p;
}
void main()
{
    DLinkList h;
    int n;
    int pos;
    char e;
    InitDList(&h);
    printf("输入元素个数:");
    scanf("%d",&n);
     getchar();
    CreateDList(h,n);
    printf("链表中的元素:");
    PrintDList(h);
    printf("请输入插入的元素及位置:");
    scanf("%c",&e);
    getchar();
    scanf("%d",&pos);
    InsertDList(h,pos,e);
    printf("插入元素后链表中的元素:");
    PrintDList(h);
}
void PrintDList(DLinkList head)
/*输出双向循环链表中的每一个元素*/
{
    DListNode *p;
    p=head->next;
    while(p!=head)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}
搜索更多相关主题的帖子: 链表 元素 
2010-08-09 09:21
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:20 
哪里不行?说清楚

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-08-09 10:40
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
收藏
得分:0 
可以编译,但是输入插入的元素之后,再输出链表,没有变化啊,就是元素好像没有插入到链表中
2010-08-09 13:13
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:0 
你这个的问题是:无法将元素插入到表尾。

DListNode *GetElem(DLinkList head,int i)
/*查找插入的位置,找到返回该结点的指针,否则返回NULL*/
{
    DListNode *p;
    int j;
    p=head->next;
    j=1;
    while(p!=head&&j<=i)
    {
        p=p->next;
        j++;
    }
    if(p == head&&j == i)                /*如果要位置不正确,返回NULL*/
    {
        return p;
    }
    else
        return NULL;

    return p;
}
程序代码:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
/*类型定义*/
typedef char DataType;

typedef struct Node
{
    DataType data;
    struct Node *prior;
    struct Node *next;
}DListNode,*DLinkList;

/*函数声明*/
int InitDList(DLinkList *head);
DListNode *GetElem(DLinkList head,int i);
void PrintDList(DLinkList head);
int CreateDList(DLinkList head,int n);
int InsertDList(DLinkList head,int i,char e);

void main()
{
    DLinkList h;
    int n;
    int pos;
    char e;
    InitDList(&h);
    printf("输入元素个数:");
    scanf("%d",&n);
     getchar();
    CreateDList(h,n);
    printf("链表中的元素:");
    PrintDList(h);
    printf("请输入插入的元素及位置:");
    scanf("%c",&e);
    getchar();
    scanf("%d",&pos);
    InsertDList(h,pos,e);
    printf("插入元素后链表中的元素:");
    PrintDList(h);
}


/*函数实现*/
int InitDList(DLinkList *head)
/*初始化双向循环链表*/
{
    *head=(DLinkList)malloc(sizeof(DListNode));
    if(!head)
        return -1;
    (*head)->next=*head;            /*使头结点的prior指针和next指针指向自己*/
    (*head)->prior=*head;
    return 1;
}

int CreateDList(DLinkList head,int n)
/*创建双向循环链表*/
{
    DListNode *p,*q;
    int i;
    char e;
    q=head;
    for(i=1;i<=n;i++)
    {
        printf("输入第%d个元素",i);
        e=getchar();
        p=(DListNode*)malloc(sizeof(DListNode));
        p->data=e;
        /*将新生成的结点插入到双向循环链表*/
        p->next=q->next;
        q->next=p;
        p->prior=q;
        head->prior=p;                /*这里要注意头结点的prior指向新插入的结点*/
        q=p;                        /*q始终指向最后一个结点*/
        getchar();
    }    
    return 1;
}

int InsertDList(DLinkList head,int i,char e)
/*在双向循环链表的第i个位置插入元素e。插入成功返回1,否则返回0*/
{
    DListNode *p,*s;
    p=GetElem(head,i);                /*查找链表中第i个结点*/
    if(!p)
        return 0;
    s=(DListNode*)malloc(sizeof(DListNode));
    if(!s)
        return -1;
    s->data=e;
    /*将s结点插入到双向循环链表*/
    s->prior=p->prior;
    p->prior->next=s;
    s->next=p;
    p->prior=s;
    return 1;
}

DListNode *GetElem(DLinkList head,int i)
/*查找插入的位置,找到返回该结点的指针,否则返回NULL*/
{
    DListNode *p;
    int j;
    p=head->next;
    j=1;
    while(p!=head&&j<=i)
    {
        p=p->next;
        j++;
    }
    if(p == head&&j == i)                /*如果要位置不正确,返回NULL*/
    {
        return p;
    }
    else
        return NULL;
    return p;
}

void PrintDList(DLinkList head)
/*输出双向循环链表中的每一个元素*/
{
    DListNode *p;
    p=head->next;
    while(p!=head)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}


[ 本帖最后由 hzh512 于 2010-8-9 14:07 编辑 ]

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-08-09 14:05
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
收藏
得分:0 
我把你的代码运行了一下,结果和我上面的好像一样啊,也不行啊
怎么回事呢???
2010-08-09 14:34
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:0 
程序代码:
DListNode *GetElem(DLinkList head,int i)
/*查找插入的位置,找到返回该结点的指针,否则返回NULL*/
{
    DListNode *p;
    int j;
    p=head->next;
    j=1;
    while(p!=head&&j<i)
    {
        p=p->next;
        j++;
    }
    if(p != head&&j > i)                /*如果要位置不正确,返回NULL*/
    {
        return NULL;
    }
    
    return p;
}

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-08-09 15:38
wwqiu
Rank: 2
等 级:论坛游民
帖 子:19
专家分:12
注 册:2010-7-28
收藏
得分:0 
分给了,但是有个问题好奇怪的,我第一次发的源代码下午的时候,是可以编译,但是插入不了元素,现在我又试了原来的代码,不知道为什么又可以插入元素了,这是为什么呢???
2010-08-09 20:29
快速回复:在双向链表中插入元素,弄了好久都不行啊,求助
数据加载中...
 
   



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

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