雙向循環鏈表的表示和實現(C語言)

#include<stdio.h>
#include<malloc.h>
//雙向循環鏈表的表示和實現,帶頭結點 
typedef int ElemType;
typedef struct node{
	struct node *next;
	struct node *prior;
	ElemType data;
}dlink;
//創建循環鏈表
dlink *creatdlink(int n){
	dlink *head,*p,*s;
	int i;
	p=head=(dlink *)malloc(sizeof(dlink));
	for(i=1;i<=n;i++){
		 s=(dlink *)malloc(sizeof(dlink));
		 scanf("%d",&s->data);
		 p->next=s;
		 s->prior=p;
		 p=s;
	}
	p->next=head;
	head->prior=p;
	return head;
} 
//輸出操作,從正向輸出鏈表 
dlink *showdlink(dlink *head){
	dlink *p;
	p=head->next;
	while(p!=head){
		printf("%d ",p->data);
		p=p->next;
	}
	return head;
} 

//求表長操作, 
int getlen(dlink *head){
	int i;
	dlink *p;
	p=head->next;i=0;
	while(p!=head){
		p=p->next;
		i++;
	}
	return i;
} 
//刪除操作,刪除帶頭結點的雙向循環鏈表的第i個結點
int deletei(dlink *head,int i){
	dlink *p,*s;
	int j;
	p=head->next;j=1;
	if(i<1)return 0;//未刪除成功
	while(p!=head&&j<i-1){
		p=p->next;
		j++;
	} 
	if(p==head)return 0;
	s=p->next;
	p->next=s->next;
	s->next->prior=p;
	free(s);
	return 1;//刪除成功 
} 
//插入操作,向帶有頭結點的雙向循環鏈表第i個結點前插入一個結點
int insertx(dlink *head,int i,ElemType x){
	dlink *p,*s;
	int j;
	p=head->next;j=1;
	if(i<1)return 0;
	while(p!=head&&j<i-1){
		p=p->next;
		j++;
	}
	if(p==head)return 0;
	s=(dlink *)malloc(sizeof(dlink));
	s->data=x;
	s->next=p->next;
	s->prior=p;
	p->next->prior=s;
	p->next=s;
	return 1; 
} 
int main(){
	dlink *head;
	head=creatdlink(5);
	showdlink(head);
	printf("該鏈表表長爲:%d\n",getlen(head));
//	deletei(head,3);//刪除第3個結點 
//	insertx(head,3,9);//在第3個結點前插入9 
	showdlink(head); 
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章