- 都挺简单的,就是要注意,无论单链表还是双链表,删除时都要遵循
先链后断
- 双链表插入和删除时,指针可直接移到要插入或者的位置,不用像单链表一定要移到其前驱结点,因为双链表每个结点自带前驱指针
typedef struct DLNode{
int data;
struct DLNode *prior;
struct DLNode *next;
}DLNode;
void createDLink(DLNode *&p,int arr[],int n){//创建双链表
int i;
DLNode *r,*s,*q;
p=(DLNode *)malloc(sizeof(DLNode));
p->prior=NULL;
p->next=NULL;
r=p;
for(i=0;i<n;i++){
s=(DLNode *)malloc(sizeof(DLNode));
s->data=arr[i];
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL;
}
int insert(DLNode *&p,int key,int pos){//插入结点(在第pos位置上插入key)
DLNode *r,*s,*q;
int i,count=0;
r=p;
while(r->next!=NULL){
count++;
if(count==pos){
q=r->next;//记录原来第pos位置上的结点
s=(DLNode *)malloc(sizeof(DLNode));
s->data=key;
r->next=s;//r后继指针连接新结点
s->next=q;//新结点后继指针连接原先结点
s->prior=r;//新结点前驱指针指向r
q->prior=s;
return 1;
}
r=r->next;
}
return 0;
}
int search(DLNode *q,int key){//查找结点,返回结点位置
DLNode *p=q->next;
int count=0;
while(p!=NULL){
count++;
if(p->data==key){
return count;
}
p=p->next;
}
return 0;
}
int del(DLNode *&p,int key){//删除结点
DLNode *r,*s,*q,*l;
int i;
r=p->next;
while(r!=NULL){//双链表删除结点就可直接让指针指向要删除的结点,依靠它有前驱指针搞定
if(r->data==key){
q=r->prior;
s=r->next;
q->next=s;
s->prior=q;
free(r);
break;
}
r=r->next;
}
}
void print(DLNode *p){//打印双链表
DLNode *q;
q=p->next;
while(q!=NULL){
printf("%d ",q->data);
q=q->next;
}
printf("\n");
}
int main(int argc, char** argv) {
DLNode *p;
int arr[]={24,22,98,5,46};
createDLink(p,arr,5);//创建链表
print(p);
insert(p,408,3);//插入
print(p);
del(p,98);
print(p);
int n=search(p,5);
if(n){
printf("查找成功,在链表的第%d个位置\n",n);
}else{
printf("链表中没这个东西\n");
}
return 0;
}