是否是最近编写链表的程序写多了,今天写的这个《删除带头结点的双循环链表p中第i个结点》一次就成功,呵呵!值得小小的奖励下!不过,删除双向链表中的某个节点是较简单点,写出来与大家分享分享
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
struct DuNode{
char date;
struct DuNode *prior;
struct DuNode *next;
}*head;
struct DuNode *creatDuNode(void)
{
struct DuNode *p,*q;
int i;
if(!(head=(struct DuNode *)malloc(sizeof(struct DuNode))))
exit(0);
head->date='/0';
head->prior=NULL;
head->next=NULL;
p=head;
for(i=0;i<5;i++)
{
if(!(q=(struct DuNode*)malloc(sizeof(struct DuNode))))
exit(0);
printf("please input date:/n");
scanf("%c",&q->date);
getchar();
q->prior=p;
q->next=NULL;
p->next=q;
p=q;
}
return (head);
}
//删除带头结点的双循环链表p中第i个结点
struct DuNode *DelDuNode(struct DuNode *p,int i)
{
int j=0,flg=0;
if(p==NULL)
exit(0); //如果p为空的话就退出
while(p!=NULL) //在p没有到表尾时,查找i的位置
{
if(j!=i)
{
p=p->next;
j++;
continue;
}
flg=1;
break;
}
if(flg==1)
{
p->prior->next=p->next;
p->next->prior=p->prior;
}
else
{
printf("error del/n");
}
return (head->next);
}
int main()
{
struct DuNode *p;
int i;
char e;
creatDuNode();
p=head->next;
printf("please input number:/n");
scanf("%d",&i);
p=DelDuNode(p,i);
while(p!=NULL)
{
printf("p->date=%c/n",p->date);
p=p->next;
}
return 0;
}