这是我做的一个简单的双向循环链表。
在双向循环链表当中最重要的是对四个指针的控制,其它地方与之前学的无异。
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef int DataType; 4 //链表结点 5 typedef struct node{ 6 DataType data; 7 struct node *front; 8 struct node *next; 9 }LinkList; 10 //初始化双向链表 11 int IntList(LinkList *L){ 12 L=(LinkList*)malloc(sizeof(LinkList)); 13 L->front=L->next=L; 14 L->data=0; 15 } 16 //输入双向链表的值(尾插法) 17 int InputList(LinkList *L){ 18 LinkList *NewNode,*p; 19 p=L; 20 int length,data; 21 printf("请输入想要创建链表的长度:"); 22 scanf("%d",&length); 23 for(int i=0; i<length; i++) { 24 NewNode=(LinkList*)malloc(sizeof(LinkList)); 25 if(NewNode==NULL){ 26 printf("内存分配失败! "); 27 return 0; 28 } 29 printf("请输入第%d个节点元素值:",i+1); 30 scanf("%d",&data); 31 NewNode->data=data; 32 /*1*/ NewNode->next=L; 33 /*2*/ NewNode->front=p; 34 /*3*/ p->next=NewNode; 35 /*4*/ L->front=NewNode; 36 //1和4是固定的,2和3是动态的。 37 p=NewNode; 38 } 39 } 40 //打印链表 41 int TraverseDbCcLinkList(LinkList *L) 42 { 43 LinkList *p = L->next; 44 45 printf("链表打印如: "); 46 while (p!=L) 47 { 48 printf("%d ", p->data); 49 p = p->next; 50 } 51 printf(" "); 52 printf("打印成功 "); 53 } 54 //计算链表长度 55 int GetLength(LinkList *L){ 56 int length=0; 57 LinkList *p=L->next; 58 while(p!=L){ 59 length++; 60 p=p->next; 61 } 62 return printf("链表长度为%d ",length); 63 } 64 //向链表内插入节点 65 int InsertLinkList(LinkList *L){ 66 LinkList *p=L->next; 67 int n,m,i=1; 68 printf("请输入想要插在第几个位置后面: "); 69 scanf("%d",&n); 70 while(p!=L&&i<n){ 71 i++; 72 p=p->next; 73 } 74 if(p==L){ 75 return printf("要插入的位置不存在! "); 76 77 }else{ 78 LinkList *S=(LinkList*)malloc(sizeof(LinkList)); 79 printf("请输入要插入的值 "); 80 scanf("%d",&m); 81 S->data=m; 82 S->next=p->next; 83 S->front=p; 84 p->next->front=S; 85 p->next=S; 86 } 87 return printf("插入成功! "); 88 } 89 //删除某个位置的数 90 int DelLinklist(LinkList *L){ 91 LinkList *p=L->next,*q; 92 int n,i=1; 93 printf("请输入要删除的位置 "); 94 scanf("%d",&n); 95 while(p!=L&&i<n-1){ 96 i++; 97 p=p->next; 98 } 99 if(p==L){ 100 return printf("需要删除的位置不存在! "); 101 }else{ 102 q=p->next; 103 printf("删除的数为%d ",q->data); 104 p->next=p->next->next; 105 p->next->front=p; 106 free(q); 107 } 108 return printf("删除成功! "); 109 } 110 //查找链表某位置的数 111 int FoundElem(LinkList *L){ 112 LinkList *p=L->next; 113 int n,i=1; 114 printf("请输入你想查找的位置 "); 115 scanf("%d",&n); 116 while(p!=L&&i<n){ 117 i++; 118 p=p->next; 119 } 120 if(p==L){ 121 return printf("位置不存在! "); 122 }else{ 123 return printf("该位置的值为%d",p->data); 124 } 125 126 } 127 int main(){ 128 LinkList L; 129 IntList(&L); 130 InputList(&L); 131 TraverseDbCcLinkList(&L); 132 InsertLinkList(&L); 133 GetLength(&L); 134 TraverseDbCcLinkList(&L); 135 DelLinklist(&L); 136 GetLength(&L); 137 TraverseDbCcLinkList(&L); 138 FoundElem(&L); 139 140 }