PS:1、整体->next(或prior)=整体->prior(或next) 整体->next(或prior)=整体
2、注意代码顺序
3、删除函数 ListDelete(DuLinkList &L) 里的 free(p); //不知道为什么注释掉这个就对了。。。否则会出现下图的情况。。。
解决free();中止问题:(与单链表里的问题一样)
L的malloc的sizeof里是LinkList,p的malloc的sizeof里是LNode
sizeof(LinkList)!=sizeof(LNode) 链表结点的指针大小不等于链表结点的大小
申请空间时将指针当成了结点,释放时越界
完整代码:
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#define OK 1
#define OVERFLOW -2
#define ERROR 0
typedef int Elemtype;
typedef int Status;
typedef struct DuLNode
{
Elemtype data;
struct DuLNode *prior;
struct DuLNode *next; //next是指针,不要忘了*
}DuLNode,*DuLinkList;
void Create(DuLinkList &L)
{
DuLinkList p;
L=(DuLinkList)malloc(sizeof(DuLinkList));
L->prior=NULL;
L->next=NULL;
int n,i;
cout<<"创建元素个数:";
cin>>n;
DuLinkList r=L;
for(i=1;i<=n;i++)
{
p=(DuLinkList)malloc(sizeof(DuLNode));
cin>>p->data;
p->next=NULL;
p->prior=r;
r->next=p; //r->next=p->prior;(原是这与上行的语句,错的,导致后面的停止工作)带next、prior的都是指向主体的
r=p; //r移到p处
}
cout<<"输入完毕\n";
}
Status ListInsert(DuLinkList &L)
{
int i,j=1;
Elemtype e;
DuLinkList p=L->next,s;
cout<<"想插入第几个位置之前:";
cin>>i; //这之后停止工作??(已解决)
while(p&&j<i)
{
p=p->next;j++;
}
if(!p||j>i) return ERROR;
if(!(s=(DuLinkList)malloc(sizeof(DuLinkList))))
return ERROR;
cout<<"想插入的元素:";
cin>>e;
s->data=e;
s->prior=p->prior;p->prior->next=s;
s->next=p;p->prior=s;
return OK;
}
Status ListDelete(DuLinkList &L)
{
int i,j=1;
Elemtype e;
DuLinkList p=L->next;
cout<<"想删除的位置:"; //在这之后停止工作??改了创建后是中止??其他都对(已解决)
cin>>i;
while(p&&j<i)
{
p=p->next;j++;
}
if(!p||j>i) return ERROR;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p); //不知道为什么注释掉这个就对了。。。NONONO将创建里的sizeof里改为DuLNode
return OK;
}
void Output(DuLinkList L) //有问题,停止工作??(已解决)
{
DuLinkList p;
p=L->next;
cout<<"输出为:";
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl; //空行以免算上1.****的
}
Status LinkLength(DuLinkList L) //有问题,停止工作??(已解决)
{
DuLinkList p=L;
int i=0;
while(p->next)
{
p=p->next;
i++;
}
return i;
}
void main()
{
DuLinkList L;
int n;
while(1)
{
cout<<"1.创建"<<endl;
cout<<"2.插入"<<endl;
cout<<"3.删除"<<endl;
cout<<"4.输出"<<endl;
cout<<"5.长度"<<endl;
cout<<"6.退出"<<endl;
cout<<"请输入要操作的数字:"<<endl;
cin>>n;
switch(n)
{
case 1:Create(L);break;
case 2:ListInsert(L);break;
case 3:ListDelete(L);break;
case 4:Output(L);break;
case 5:{printf("长度为:%d\n",LinkLength(L));}break;
case 6:exit(0);break;
}
}
}