愿你 发表于 2018-4-2 21:52:26

为什么delete函数删不了最后一个元素

我的删除函数不能删除最后一个元素
那要怎么编写才可以??
# include <stdio.h>
# include <stdlib.h>

typedef struct Dulnode{
        int data;
        struct Dulnode *prior;
        struct Dulnode *next;
}Dulnode,*Dulinklist;

void initlist(Dulinklist *L) //初始化双向链表
{
        (*L)=(Dulinklist)malloc(sizeof(Dulnode));
        if(!(*L))
                printf("无法正常分配空间,对不起哦!\n");
        else
        {
                (*L)->prior=(*L)->next=NULL;
                printf("初始化成功!");
        }
}


void creatlist(Dulinklist *L) //创建双向链表
{
        int n,i;
        Dulinklist r,p;//指向尾节点
        r=*L;
        printf("请问您想输入几个元素:");
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                p=(Dulinklist)malloc(sizeof(Dulnode));
                if(!p)
                        printf("无法正常分配空间,对不起哦~\n");
                else
                {
                        printf("请输入第%d个元素",i+1);
                        scanf("%d",&p->data);
                        p->next=r->next;
                        p->prior=r;
                        r->next=p;
                        r=p;
                }
        }
}

void showlist(Dulinklist *L) //输出双向链表
{

        Dulinklist p;
        p=(*L)->next;
        if((*L)->next==NULL)
                printf("双向链表中没有元素,不可以输出哦~\n");
        else if((*L)->next!=NULL)
        {        printf("该双向链表中的元素为:");
                while(p!=NULL)
                {
                        printf("%d ",p->data);
                        p=p->next;
                }
        }
        else
                printf("您的线性表不存在哦,不可以显示元素呢~");
        printf("\n");
}

int lengthlist(Dulinklist L) //求表长
{
        Dulinklist p;
        int length=0;
        p=L->next;
        while(p!=NULL)
        {
                length++;
                p=p->next;
        }
        printf("您的表长为%d\n",length);
        return length;
}

void isemptylist(Dulinklist *L) //判断该双向链表是否为空
{
        if((*L)->next==NULL)
                printf("您的链表为空。\n");
        else
                printf("您的链表不为空\n");
}


void destroylist(Dulinklist *L)//销毁链表
{
        Dulinklist p,q;
        p=*L;
        while(p)
        {
                q=p->next;
                free(p);
                p=q;
        }
        printf("已经销毁线性表了哦~\n");
}

void clearlist(Dulinklist *L) //清空线性表
{
        Dulinklist p,q;
        p=(*L)->next;
        while(p!=NULL)
        {
                q=p->next;
                free(p);
                p=q;
        }
        (*L)->next=NULL;
        printf("已经清空双向链表了哦~\n");
}

void getelem(Dulinklist *L) //根据查询位置给出元素内容
{
        int i,j,e;
        Dulinklist p;
        printf("请问您想要查询哪一个位置的元素内容:");
        scanf("%d",&i);
        p=(*L)->next;
        j=0;
        while(p)
        {
                ++j;
                if(i==j)
                {
                        e=p->data;
                        printf("您查询的位置的元素内容为:%d\n",e);
                        break;
                }
                p=p->next;
        }
        if(i!=j||!p)
                printf("您的输入位置有误,无法查询。\n");
}

void locateelem(Dulinklist *L) //根据元素内容查询元素位置
{
        int e,j=0;
        Dulinklist p;
        p=(*L)->next;
        printf("请输入您想要查询的元素内容:");
        scanf("%d",&e);
        while(p)
        {
                j++;
                if(e==p->data)
                {
                        printf("您所要查询的元素内容位于%d号!\n",j);
                        break;
                }
                p=p->next;
        }
        if(!p)
                printf("无法查询到元素位置。\n");
}

void insertlist(Dulinklist *L) //在指定元素位置前插入某元素
{
        int i,e,j=0;
        Dulinklist p,s;
        p=(*L);
        printf("请问您想要在哪一号元素前插入什么内容:");
        scanf("%d,%d",&i,&e);
        while(p&&j<i-1)
        {
                p=p->next;       
                ++j;               
        }
        if(!p||j>i-1)
                printf("插入位置有误。\n");
        else
        {
                s=(Dulinklist)malloc(sizeof(Dulnode));
                if(!s)
                        printf("分配空间失败,无法进行插入~\n");
                else
                {
                        s->data=e;
                        s->prior=p;
                        s->next=p->next;
                        p->next->prior=s;
                        p->next=s;
                }
        }
}


void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
        int i,j,e;
        Dulinklist p,q;
        p=(*L);
        j=0;
        printf("请问您想删除哪一号的元素内容:");
        scanf("%d",&i);
        while(p->next&&j<i-1)
        {       
                p=p->next;
                ++j;
        }
        if(!(p->next)||j>i-1)
                printf("删除位置有误。\n");
        else
        {
                q=p->next;
                e=q->data;
                p->next=q->next;
                q->next->prior=p;
                free(q);

        }

}


int main()
{
        Dulinklist L;
        initlist(&L);
        creatlist(&L);
        showlist(&L);
        isemptylist(&L);
        //clearlist(&L);
        //isemptylist(&L);
        //destroylist(&L);
        //showlist(&L);
        //getelem(&L);
        //locateelem(&L);
        lengthlist(L);
        insertlist(&L);
        showlist(&L);
        deletelist(&L);
        showlist(&L);
        lengthlist(L);
        return 0;
}@人造人

人造人 发表于 2018-4-3 09:02:01

初始化成功!请问您想输入几个元素:4
请输入第1个元素0
请输入第2个元素1
请输入第3个元素2
请输入第4个元素3
该双向链表中的元素为:0 1 2 3
您的链表不为空
您的表长为4
请问您想要在哪一号元素前插入什么内容:1
该双向链表中的元素为:-858993460 0 1 2 3
请问您想删除哪一号的元素内容:3
该双向链表中的元素为:-858993460 0 2 3
您的表长为4
请按任意键继续. . .

你的问题是???

愿你 发表于 2018-4-3 20:14:14

人造人 发表于 2018-4-3 09:02
你的问题是???

我现在没问题了这个删除函数。
我现在就还是搞不懂销毁的问题{:10_266:}

愿你 发表于 2018-4-3 21:12:41

人造人 发表于 2018-4-3 09:02
你的问题是???

我之前用单链表可以删除 现在我用双向链表又不可以删除了...
而且我只有最后一个元素不能删除,其他都可以正常删除

这是为什么???是因为是双向链表吗?所以最后一个元素当执行q->next->prior=p语句会出问题吗?

我执行的结果是这样的:见图
# include <stdio.h>
# include <stdlib.h>

typedef struct Dulnode{
        int data;
        struct Dulnode *prior;
        struct Dulnode *next;
}Dulnode,*Dulinklist;

void initlist(Dulinklist *L) //初始化双向链表
{
        (*L)=(Dulinklist)malloc(sizeof(Dulnode));
        if(!(*L))
                printf("无法正常分配空间,对不起哦!\n");
        else
        {
                (*L)->prior=(*L)->next=NULL;
                printf("初始化成功!");
        }
}


void creatlist(Dulinklist *L) //创建双向链表
{
        int n,i;
        Dulinklist r,p;//指向尾节点
        r=*L;
        printf("请问您想输入几个元素:");
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                p=(Dulinklist)malloc(sizeof(Dulnode));
                if(!p)
                        printf("无法正常分配空间,对不起哦~\n");
                else
                {
                        printf("请输入第%d个元素",i+1);
                        scanf("%d",&p->data);
                        p->next=NULL;
                        p->prior=r;
                        r->next=p;
                        r=p;
                }
        }
}

void showlist(Dulinklist *L) //输出双向链表
{

        Dulinklist p;
        p=(*L)->next;
        if((*L)->next==NULL)
                printf("双向链表中没有元素,不可以输出哦~\n");
        else if((*L)->next!=NULL)
        {        printf("该双向链表中的元素为:");
                while(p!=NULL)
                {
                        printf("%d ",p->data);
                        p=p->next;
                }
        }
        else
                printf("您的线性表不存在哦,不可以显示元素呢~");
        printf("\n");
}

int lengthlist(Dulinklist *L) //求表长
{
        Dulinklist p;
        int length=0;
        p=(*L)->next;
        while(p!=NULL)
        {
                length++;
                p=p->next;
        }
        printf("您的表长为%d\n",length);
        return length;
}

void isemptylist(Dulinklist *L) //判断该双向链表是否为空
{
        if((*L)->next==NULL)
                printf("您的链表为空。\n");
        else
                printf("您的链表不为空\n");
}


void destroylist(Dulinklist *L)//销毁链表
{
        Dulinklist p,q;
        p=*L;
        while(p)
        {
                q=p->next;
                free(p);
                p=q;
        }
        printf("已经销毁线性表了哦~\n");
}

void clearlist(Dulinklist *L) //清空线性表
{
        Dulinklist p,q;
        p=(*L)->next;
        while(p!=NULL)
        {
                q=p->next;
                free(p);
                p=q;
        }
        (*L)->next=NULL;
        printf("已经清空双向链表了哦~\n");
}

/*void getelem(Dulinklist *L) //根据查询位置给出元素内容
{
        int i,j,e;
        Dulinklist p;
        printf("请问您想要查询哪一个位置的元素内容:");
        scanf("%d",&i);
        p=(*L)->next;
        j=0;
        while(p)
        {
                ++j;
                if(i==j)
                {
                        e=p->data;
                        printf("您查询的位置的元素内容为:%d\n",e);
                        break;
                }
                p=p->next;
        }
        if(i!=j||!p)
                printf("您的输入位置有误,无法查询。\n");
}*/

void getelem(Dulinklist *L)
{
        int i,j,e;
        Dulinklist p;
        printf("请问您想要查询哪一个位置的元素内容:");
        scanf("%d",&i);
        p=(*L),j=0;
        while(p&&j<i)
        {
                p=p->next;
                j++;
        }
        if(!p||j>i)
                printf("查询位置有误,无法查询\n");
        else
        {
                e=p->data;
                printf("您查询的位置的元素是:%d\n",e);
        }
}



void locateelem(Dulinklist *L) //根据元素内容查询元素位置
{
        int e,j=0;
        Dulinklist p;
        p=(*L)->next;
        printf("请输入您想要查询的元素内容:");
        scanf("%d",&e);
        while(p)
        {
                j++;
                if(e==p->data)
                {
                        printf("您所要查询的元素内容位于%d号!\n",j);
                        break;
                }
                p=p->next;
        }
        if(!p)
                printf("无法查询到元素位置。\n");
}

void insertlist(Dulinklist *L) //在指定元素位置前插入某元素
{
        int i,e,j=0;
        Dulinklist p,s;
        p=(*L);
        printf("请问您想要在哪一号元素前插入什么内容:");
        scanf("%d,%d",&i,&e);
        while(p&&j<i-1)
        {
                p=p->next;       
                ++j;               
        }
        if(!p||j>i-1)
                printf("插入位置有误。\n");
        else
        {
                s=(Dulinklist)malloc(sizeof(Dulnode));
                if(!s)
                        printf("分配空间失败,无法进行插入~\n");
                else
                {
                        s->data=e;
                        s->prior=p;
                        s->next=p->next;
                        p->next->prior=s;
                        p->next=s;
                }
        }
}


void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
        int i,j,e,len;
        Dulinklist p,q;
        p=(*L);
        j=0;
        printf("请问您想删除哪一号的元素内容:");
        scanf("%d",&i);
        while(p&&j<i-1)
        {       
                p=p->next;
                ++j;
        }
        if(!p||j>i-1)
                printf("删除位置有误。\n");

        else
        {
                q=p->next;
                e=q->data;
               
                p->next=q->next;
                q->next->prior=p;
                free(q);
        }


}


int main()
{
        Dulinklist L;
        initlist(&L);
        creatlist(&L);
        showlist(&L);
        //isemptylist(&L);
        //clearlist(&L);
        //isemptylist(&L);
        //destroylist(&L);
        //showlist(&L);
        //getelem(&L);
        //locateelem(&L);
        lengthlist(&L);
        //insertlist(&L);
        //showlist(&L);
        deletelist(&L);
        showlist(&L);
        lengthlist(&L);
        return 0;
}

人造人 发表于 2018-4-3 21:56:51

愿你 发表于 2018-4-3 21:12
我之前用单链表可以删除 现在我用双向链表又不可以删除了...
而且我只有最后一个元素不能删除,其他都可 ...

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

typedef struct Dulnode {
        int data;
        struct Dulnode *prior;
        struct Dulnode *next;
}Dulnode, *Dulinklist;

void initlist(Dulinklist *L) //初始化双向链表
{
        (*L) = (Dulinklist)malloc(sizeof(Dulnode));
        if(!(*L))
                printf("无法正常分配空间,对不起哦!\n");
        else
        {
                (*L)->prior = (*L)->next = NULL;
                printf("初始化成功!");


                (*L)->data = 1234;        // debug
        }
}


void creatlist(Dulinklist *L) //创建双向链表
{
        int n, i;
        Dulinklist r, p;//指向尾节点
        r = *L;
        printf("请问您想输入几个元素:");
        scanf("%d", &n);
        for(i = 0; i<n; i++)
        {
                p = (Dulinklist)malloc(sizeof(Dulnode));
                if(!p)
                        printf("无法正常分配空间,对不起哦~\n");
                else
                {
                        printf("请输入第%d个元素", i + 1);
                        scanf("%d", &p->data);
                        p->next = NULL;
                        p->prior = r;
                        r->next = p;
                        r = p;
                }
        }
}

void showlist(Dulinklist *L) //输出双向链表
{

        Dulinklist p;
        p = (*L)->next;
        if((*L)->next == NULL)
                printf("双向链表中没有元素,不可以输出哦~\n");
        else if((*L)->next != NULL)
        {
                printf("该双向链表中的元素为:");
                while(p != NULL)
                {
                        printf("%d ", p->data);
                        p = p->next;
                }
        }
        else
                printf("您的线性表不存在哦,不可以显示元素呢~");
        printf("\n");
}

int lengthlist(Dulinklist *L) //求表长
{
        Dulinklist p;
        int length = 0;
        p = (*L)->next;
        while(p != NULL)
        {
                length++;
                p = p->next;
        }
        printf("您的表长为%d\n", length);
        return length;
}

void isemptylist(Dulinklist *L) //判断该双向链表是否为空
{
        if((*L)->next == NULL)
                printf("您的链表为空。\n");
        else
                printf("您的链表不为空\n");
}


void destroylist(Dulinklist *L)//销毁链表
{
        Dulinklist p, q;
        p = *L;
        while(p)
        {
                q = p->next;
                free(p);
                p = q;
        }
        printf("已经销毁线性表了哦~\n");
}

void clearlist(Dulinklist *L) //清空线性表
{
        Dulinklist p, q;
        p = (*L)->next;
        while(p != NULL)
        {
                q = p->next;
                free(p);
                p = q;
        }
        (*L)->next = NULL;
        printf("已经清空双向链表了哦~\n");
}

/*void getelem(Dulinklist *L) //根据查询位置给出元素内容
{
int i,j,e;
Dulinklist p;
printf("请问您想要查询哪一个位置的元素内容:");
scanf("%d",&i);
p=(*L)->next;
j=0;
while(p)
{
++j;
if(i==j)
{
e=p->data;
printf("您查询的位置的元素内容为:%d\n",e);
break;
}
p=p->next;
}
if(i!=j||!p)
printf("您的输入位置有误,无法查询。\n");
}*/

void getelem(Dulinklist *L)
{
        int i, j, e;
        Dulinklist p;
        printf("请问您想要查询哪一个位置的元素内容:");
        scanf("%d", &i);
        p = (*L), j = 0;
        while(p&&j<i)
        {
                p = p->next;
                j++;
        }
        if(!p || j>i)
                printf("查询位置有误,无法查询\n");
        else
        {
                e = p->data;
                printf("您查询的位置的元素是:%d\n", e);
        }
}



void locateelem(Dulinklist *L) //根据元素内容查询元素位置
{
        int e, j = 0;
        Dulinklist p;
        p = (*L)->next;
        printf("请输入您想要查询的元素内容:");
        scanf("%d", &e);
        while(p)
        {
                j++;
                if(e == p->data)
                {
                        printf("您所要查询的元素内容位于%d号!\n", j);
                        break;
                }
                p = p->next;
        }
        if(!p)
                printf("无法查询到元素位置。\n");
}

void insertlist(Dulinklist *L) //在指定元素位置前插入某元素
{
        int i, e, j = 0;
        Dulinklist p, s;
        p = (*L);
        printf("请问您想要在哪一号元素前插入什么内容:");
        scanf("%d,%d", &i, &e);
        while(p&&j<i - 1)
        {
                p = p->next;
                ++j;
        }
        if(!p || j>i - 1)
                printf("插入位置有误。\n");
        else
        {
                s = (Dulinklist)malloc(sizeof(Dulnode));
                if(!s)
                        printf("分配空间失败,无法进行插入~\n");
                else
                {
                        s->data = e;
                        s->prior = p;
                        s->next = p->next;
                        p->next->prior = s;
                        p->next = s;
                }
        }
}


void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
        int i, j, e;
        Dulinklist p, q;
        p = (*L);
        j = 0;
        printf("请问您想删除哪一号的元素内容:");
        scanf("%d", &i);
        while(p&&j<i - 1)
        {
                p = p->next;
                ++j;
        }
        if(!p || j>i - 1)
                printf("删除位置有误。\n");

        else
        {
                q = p->next;
                e = q->data;

                p->next = q->next;
                if(q->next != NULL)
                        q->next->prior = p;
                free(q);
        }


}


int main()
{
        Dulinklist L;
        initlist(&L);
        creatlist(&L);
        showlist(&L);
        //isemptylist(&L);
        //clearlist(&L);
        //isemptylist(&L);
        //destroylist(&L);
        //showlist(&L);
        //getelem(&L);
        //locateelem(&L);
        lengthlist(&L);
        //insertlist(&L);
        //showlist(&L);
        deletelist(&L);
        showlist(&L);
        lengthlist(&L);
        return 0;
}

愿你 发表于 2018-4-3 22:02:38

人造人 发表于 2018-4-3 21:56


我之前用的是这种,但是没出来{:10_266:}
不过你就添加了一句!!!太棒了吧也!!!!{:10_298:}


void deletelist(Dulinklist *L)//删除某指定元素并用返回其值
{
        int i,j,e,len;
        Dulinklist p,q;
        p=(*L);
        j=0;
        len=lengthlist(&L);
        printf("请问您想删除哪一号的元素内容:");
        scanf("%d",&i);
        while(p&&j<i-1)
        {       
                p=p->next;
                ++j;
        }
        if(!p||j>i-1)
                printf("删除位置有误。\n");
        else if(i==len)
        {
                q=p->next;
                e=q->data;
               
                p->next=q->next;
                free(q);

        }
        else
        {
                q=p->next;
                e=q->data;
               
                p->next=q->next;
                q->next->prior=p;
                free(q);
        }

人造人 发表于 2018-4-3 22:05:03

愿你 发表于 2018-4-3 22:02
我之前用的是这种,但是没出来
不过你就添加了一句!!!太棒了吧也!!!!

意思是问题解决了?

人造人 发表于 2018-4-3 22:05:35

愿你 发表于 2018-4-3 22:02
我之前用的是这种,但是没出来
不过你就添加了一句!!!太棒了吧也!!!!

这个结果是调试出来的,要学会调试
^_^

愿你 发表于 2018-4-16 09:37:28

人造人 发表于 2018-4-3 22:05
意思是问题解决了?

对呀你解决了我的问题~

愿你 发表于 2018-4-16 09:38:07

人造人 发表于 2018-4-3 22:05
这个结果是调试出来的,要学会调试
^_^

我还是没学会调试
我中午找找资源
我之前找过了 都没看到合适的{:10_243:}

愿你 发表于 2018-4-16 09:41:28

whx2008 发表于 2018-4-4 23:32
太难啊了!想不到啊!!!

加油{:10_265:}

人造人 发表于 2018-4-16 12:32:37

愿你 发表于 2018-4-16 09:38
我还是没学会调试
我中午找找资源
我之前找过了 都没看到合适的

^_^
页: [1]
查看完整版本: 为什么delete函数删不了最后一个元素