1 #ifndef __NODE_H__ 2 #define __NODE_H__ 3 #include<stdlib.h> 4 #include <stdio.h> 5 struct linkNode{ 6 int data; 7 struct linkNode * next; 8 }; 9 struct linkHead{ 10 int length; 11 short isEmpty; 12 short isFull; 13 int Maxlength; 14 struct linkNode * next; 15 }; 16 typedef struct linkNode* p2Node; 17 typedef struct linkHead* p2Head; 18 typedef struct linkHead Head; 19 20 extern p2Head createLinkHead(); 21 extern void createLinkNodeByHead(p2Head head,int data); 22 extern void createLinkNodeByTail(p2Head head,int data); 23 extern p2Node getElement(p2Head head,int index); 24 extern int insertList(p2Head head,int position,int data); 25 extern int removeElement(p2Head head,int position); 26 extern int isEmpty(p2Head head); 27 extern int isFull(p2Head head); 28 extern int getLength(p2Head head); 30 extern void setMaxContains(p2Head head,int length); 31 #endif
这里定义了一个头文件,包含结构体的声明和函数的声明!该头文件叫做node.h
下面的node.c引入了该头文件,对上面的函数做了具体的实现!
1 #include"node.h" 2 3 p2Head createLinkHead() 4 { 5 p2Head head; 6 head= (p2Head)calloc(1,sizeof(Head)); 7 if(NULL == head) 8 { 9 printf("error calloc error! ");return ; 10 } 11 head->next=NULL; 12 head->length=0; 13 head->isEmpty=1; 14 head->isFull=0; 15 return head; 16 } 17 //头插式插入链表 18 void createLinkNodeByHead(p2Head head,int data) 19 { 20 if(1 == isFull(head)) 21 { 22 return ; 23 } 24 p2Node node; 25 node=(p2Node)calloc(1,sizeof(struct linkNode)); 26 if(NULL == node) 27 { 28 printf("error calloc error! ");return ; 29 } 30 node->data=data; 31 32 node->next=head->next; 33 head->next=node; 34 head->isEmpty=0; 35 head->length++; 36 }
37 void createLinkNodeByTail(p2Head head,int data) 38 { 39 if(1==isFull(head)) 40 { 41 return ; 42 } 43 p2Node node; 44 p2Node p=head->next,r; 45 node=(p2Node)calloc(1,sizeof(struct linkNode)); 46 if(NULL == node) 47 { 48 printf("error calloc error! ");return ; 49 } 50 if(p == NULL) //若出创建的是第一个节点,让head连接它 51 { 52 head->next=node; 53 node->next=NULL; 54 node->data=data; 55 head->length++; 56 head->isEmpty=0; 57 return ; 58 } 59 while(p != NULL) 60 { r=p; //保存p的前一次值; 61 p=p->next; 62 63 } 64 r->next=node; 65 node->next=NULL; 66 node->data=data; 67 head->isEmpty=0; 68 head->length++; 69 } 70 p2Node getElement(p2Head head,int index) //获得第n个真正节点 71 { 72 int k=1; 73 if(head == NULL || index > head->length) 74 { 75 printf("error could not get! "); 76 return ; 77 } 78 p2Node p=head->next;//p指向第一个节点 79 while(k<index) 80 { 81 p=p->next; 82 k++; 83 } 84 return p; 85 } 86 int insertList(p2Head head,int position,int data) 87 { 88 int k=1; 89 p2Node p=head->next; 90 if(1==isFull(head)) 91 { 92 return -1; 93 } 94 p2Node node=(p2Node)calloc(1,sizeof(struct linkNode )); 95 if(NULL == node) 96 { 97 printf("error calloc fault! "); 98 return -1; 99 } 100 node->data=data; 101 //插入头部(第一个位置) 102 if(position == 1) 103 { 104 node->next=head->next; 105 head->next=node; 106 head->length++; 107 return 1; 108 }//插入链表中间部位 109 else if(position<=head->length){ 110 while(k<position-1) 111 { 112 p=p->next; 113 k++; 114 } 115 node->next=p->next; 116 p->next=node; 117 head->length++; 118 return 1; 119 }//插进尾部 120 else{ 121 while(p->next!=NULL) 122 { 123 p=p->next; 124 } 125 node->next=p->next; 126 p->next=node; 127 head->length++; 128 return 1; 129 } 130 131 132 } 133 int removeElement(p2Head head,int position) 134 { 135 p2Node p=head->next,r; 136 if(head== NULL || position >head->length || position<=0) 137 { 138 printf("error could not delete! "); 139 return -1; 140 } 141 if(position==1) 142 { 143 144 head->next=p->next; 145 head->length--; 146 return 1; 147 } 148 //若是删除链表中间元素 149 else if(position < head->length) 150 { 151 int k=1; 152 while(k<position-1) 153 { 154 p=p->next; 155 k++; 156 } 157 r=p->next; 158 p->next=r->next; 159 free(r); 160 head->length--; 161 return 1; 162 } 163 else//删除尾部 164 { 165 p2Node r; 166 while(p->next!= NULL) 167 { 168 r=p; 169 p=p->next; 170 } 171 r->next=NULL; 172 free(p); 173 head->length--; 174 return 1; 175 } 176 177 } 178 179 int isEmpty(p2Head head) 180 { 181 if(head->length==0) 182 { 183 return 1; 184 } 185 else{ 186 return 0; 187 } 188 189 } 190 int isFull(p2Head head) 191 { 192 if(head->length>=head->Maxlength) 193 { 194 return 1; 195 } 196 else{ 197 return 0; 198 } 199 } 200 int getLength(p2Head head) 201 { 202 return head->length; 203 } 204 220 void setMaxContains(p2Head head,int length) //选择设置链表的最大长度 221 { 222 head->Maxlength= length; 223 }
具体使用:
1.设置该链表的最大长度
2.创建头结点
3.以头插式或尾插方式创建链表真正数据节点
4.指行插,删,查,操作!
1 #include <stdlib.h> 2 #include"node.h" 3 4 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 5 6 int main(int argc, char *argv[]) { 7 p2Head head= createLinkHead(); 8 setMaxContains(head,10); 9 createLinkNodeByTail( head,1); 10 createLinkNodeByTail( head,2); 11 createLinkNodeByTail( head,3); 12 createLinkNodeByTail( head,4); 13 createLinkNodeByTail( head,5); 14 printf("%d ",head->length); 15 insertList(head,6,10); 16 removeElement(head,6); 17 p2Node node=getElement(head,5); 18 19 printf("%d %d ",head->length,head->isEmpty); 20 return 0; 21 }