| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 389 人关注过本帖
标题:为什么不能插入到尾节点啊?
只看楼主 加入收藏
henji
Rank: 1
等 级:新手上路
帖 子:227
专家分:0
注 册:2009-4-19
结帖率:38.67%
收藏
 问题点数:0 回复次数:1 
为什么不能插入到尾节点啊?
这是一个双向循环链表,要实现插入和删除的功能?能够插入节点但是不能插入尾节点?不知道该怎么改代码?
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#define     OK      1
#define        ERROR    -1
#define     NULL   0
typedef        int ElemType;  
typedef     int Status;
typedef struct node   
{
    int data;
    struct node *prior;
    struct node *next;
}Lnode,*DuLinklist;

void creat(DuLinklist &L)
{
    DuLinklist p,q;
    int i;
    L=(DuLinklist)malloc(sizeof(Lnode));
    L->next=L;
    L->prior=L;
    q=L;
    for(i=1;i<=5;i++)
    {
        p=(DuLinklist)malloc(sizeof(Lnode));
        printf("input number:\n");
        scanf("%d",&p->data);
        p->next=L->prior;
        p->prior=q;
        q->next=p;
        q=p;
    }
}

void print(DuLinklist L)
{
    DuLinklist p;
    p=L->next;
    while(p!=L)
    {
        printf("%5d",p->data);
        p=p->next;
    }
    printf("\n");
}

Status insert(DuLinklist &L,int i,ElemType e)//不能够插入一个元素到尾节点?代码改如何修改?
{
    DuLinklist p;
    DuLinklist s;
    p=L->next;
    int j=0;
    int m=5;
        
    if(i<1)
    {
        return ERROR;
    }
    if(i<=m&&i>=1)
    {
        while(p&&j<i-1)
        {
            p=p->next;
            ++j;
        }
        s=(DuLinklist)malloc(sizeof(Lnode));
        s->data=e;
        s->prior=p->prior;
        p->prior->next=s;
        s->next=p;
        p->prior=s;
    }
    if(i>m)
    {
        s=(DuLinklist)malloc(sizeof(Lnode));
        s->data=e;
        s->prior=L->prior;
        L->prior->next=s;
        s->next=L;
        L->prior=s;
    }   
    return OK;
}

Status Delete(DuLinklist &L,int i,ElemType e)
{
    DuLinklist p;
    int m=5;
    int j=0;
    p=L->next;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(i<1)
    {
        return ERROR;
    }
    if(i<=m&&i>=1)
    {
        e=p->data;
        p->prior->next=p->next;
        p->next->prior=p->prior;
        free(p);
    }
    if(i>m)
    {
        e=p->data;
        p->prior->next=p->next;
        p->next->prior=p->prior;
        free(p);
    }
        return OK;
}

int main(int argc, char* argv[])
{
    DuLinklist L;
    int i=0;
    int e=0;
    creat(L);
    print(L);
    printf("\n");
    printf("input weizhi:\n");
    scanf("%d",&i);
    printf("input insert_number:\n");
    scanf("%d",&e);
    insert(L,i,e);
    print(L);
    printf("\n");
    printf("input delete_address:\n");
    scanf("%d",&i);
    Delete(L,i,e);
    print(L);
    return 0;
}
搜索更多相关主题的帖子: 节点 
2009-10-19 13:44
plumblossom
Rank: 2
等 级:论坛游民
帖 子:7
专家分:17
注 册:2009-10-19
收藏
得分:0 
个人觉得creat函数应该这么定义:
void creat(DuLinklist L){
    DuLinklist q,p;
    int i;
    L=(DuLinklist)malloc(sizeof(Lnode));
    L->next=NULL;
    L->prior=NULL;
    q=L;
    for(i=1;i<=5;i++){
        p=(DuLinklist)malloc(sizeof(Lnode));
        printf("input number:\n");
        scanf("%d",&p->data);
        p->next=q->next; //新节点的后继为头结点的原后继
        q->next->prior=p;//头结点的原后继节点的前继为新节点,昨晚疏忽忘记了!~
        p->prior=q;     //新节点的前继为头结点
        q->next=p;     //头节点的后继改为新节点
        q=L;         //头结点不动
    }
}
 
然后在插入的时候代码改成这样:
if(i<=m&&i>=1)
    {
        while(p&&j<i-1)
        {
            p=p->next;
            ++j;
        }
        s=(DuLinklist)malloc(sizeof(Lnode));
        s->data=e;
        s->prior=p;  //s的前继就是原尾节点
        p->next=s;   //原尾节点的后继为s
        s->next=p->next; //s的后继为原尾节点的后继
    }
 


[ 本帖最后由 plumblossom 于 2009-10-20 21:02 编辑 ]
2009-10-20 02:39
快速回复:为什么不能插入到尾节点啊?
数据加载中...
 
   



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

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