#include<stdio.h> #include<stdlib.h>node
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);//撤銷雙鏈表code
int main(void){ DNOList *list; int x; int i;get
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;
}it
void initList(DNOList **head){ *head=(DNOList *)malloc(sizeof(DNOList));//動態申請地址 (*head)->next=*head;//頭指針的next域指向頭指針 (*head)->prior=*head;//頭指針的prior域指向頭指針 }io
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;List
//找到第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;
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;
}