带头节点的循环双链表

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

typedef int DataType;

typedef struct node{ struct node *prior;//prior域 struct node *next;//next域 DataType data;//数据域 } DNOList;

void initList(DNOList **head);//初始化函数 int length(DNOList *head);//求长度函数 int insertList(DNOList *head,int i,DataType x); //插入函数 int DeleteList(DNOList *head,int i,DataType *x);//删除函数 int getElement(DNOList *head,int i,DataType *x);//取数据元素 void Destory(DNOList **head);//撤销双链表

int main(void){ DNOList *list; int x; int i;

initList(&list);
	for(i=0;i<10;i++) 
insertList(list,i,i+1);
//DeleteList(list,0, &x);

int n=length(list);
for(i=0;i<n;i++)
{
	getElement(list,i,&x);
	printf("%d ",x);
	
}
printf("\n");
printf("双链表的长度%d\n",length(list));
Destory(&list);

return 0;

}

void initList(DNOList **head){ *head=(DNOList *)malloc(sizeof(DNOList));//动态申请地址 (*head)->next=*head;//头指针的next域指向头指针 (*head)->prior=*head;//头指针的prior域指向头指针 }

int length(DNOList *head){ int count=0;//统计数量 DNOList *p=head; while(p->next!=head){ count++; p=p->next; } return count; }

int insertList(DNOList *head,int i,DataType x){ DNOList *p,*q; int j=0; p=head->next;

//找到第i个节点 while(p!=head&&j<i){ p=p->next; j++; } if(j!=i){ printf("插入的位置有误\n"); return 0; } q=(DNOList *)malloc(sizeof(DNOList)); q->data=x; q->prior=p->prior;//新节点的前驱指向i-1个节点 p->prior->next=q;//i-1节点的后继指向新节点 q->next=p;//新节点的后继指向i节点 p->prior=q;//i节点的前驱指向新节点 printf("插入成功\n"); return 1; }

int DeleteList(DNOList *head,int i,DataType *x){ DNOList *p,*q; int j=-1;//因为含有头结点所以赋值为-1 p=head;

扫描二维码关注公众号,回复: 152413 查看本文章
while(p->next!=head&&j<i){
	p=p->next;
    j++;
}

if(j!=i){
	printf("输入的参数有误\n");
	return 0;
}
 
  q=p;
 *x=p->data;
 p->prior->next=p->next;//i-1的节点的next域指向i+1 
 p->next->prior=p->prior; //i+1的前驱指向i-1
 free(q);
 printf("删除成功\n");
 return 1; 

}

void Destory(DNOList **head){ DNOList *p,*q; p=*head; int n=length(*head);//求单链表的长度,因为是循环双链表,所以不用while int i;//设置循环变量 for(i=0;i<=n;i++){ q=p; p=p->next; free(q); } *head=NULL; }

int getElement(DNOList *head,int i,DataType *x){ DNOList *p; p=head; int j=-1; while(p->next!=head&&j<i){ j++; p=p->next; }

if(j!=i){ printf("取数据元素错误"); return 0; }

*x=p->data; return 1;

}

猜你喜欢

转载自my.oschina.net/u/2511906/blog/1622934