# Data structure ## Single Link List ```c= #include <stdio.h> #include <stdlib.h> typedef struct node{ int data; struct node *next; }NODE;//別名 NODE *createList(int*,int); void printList(NODE*); void freeList(NODE*); NODE *searchNode(NODE*,int); void insertNode(NODE*,int); int main(void) { int array[]={4,5,20,8,9}; NODE *first; NODE *node; first=createList(array,5); printList(first); node=searchNode(first,20); if(node!=NULL){ insertNode(node,18); } printList(first); freeList(first); system("PAUSE"); return 0; } NODE *createList(int *array,int size){ NODE *first,*current,*previous; int i; for(i=0;i<size;i++){ current=(NODE*)malloc(sizeof(NODE)); current->data=array[i]; if(i==0){ first=current; }else{ previous->next=current; } current->next=NULL; previous=current; } return first; }; void printList(NODE *first){ NODE *print_node=first; if(first==NULL){ printf("no value\n"); }else{ while(print_node!=NULL){ printf("%3d",print_node->data); print_node=print_node->next; } printf("\n"); } }; void freeList(NODE *first){ NODE *current,*temp; current=first; while(current!=NULL){ temp=current; current=current->next; free(temp); } }; NODE *searchNode(NODE *first,int target){ NODE *current=first; while(current!=NULL){ if(current->data==target){ return current; }else{ current=current->next; } } printf("not find\n"); return NULL; }; void insertNode(NODE *node,int insert){ NODE *newnode; newnode=(NODE*)malloc(sizeof(NODE)); newnode->data=insert; newnode->next=node->next; node->next=newnode; }; ``` ## Double Link List ```c= #include<stdio.h> #include<stdlib.h> //DLL typedef struct node{ int data; struct node *pre; struct node *next; }NODE; void append(NODE **head_ref,int new_data){ //last node use to travel NODE *last=*head_ref; //allocate NODE *new_node=(NODE*)malloc(sizeof(NODE)); //put data new_node->data=new_data; //point to NULL new_node->next=NULL; //if empty ,change head and pre point to NULL if(*head_ref==NULL){ new_node->pre=NULL; *head_ref=new_node; return;//把head接上就可以結束了 } //travel to last while(last->next!=NULL){ last=last->next; } //new node add back last last->next=new_node; new_node->pre=last; return; } void push(NODE **head_ref,int new_data){ //allocate NODE *new_node=(NODE*)malloc(sizeof(NODE)); //put data new_node->data=new_data; //new node is first pre to NULL new_node->pre=NULL; new_node->next=*head_ref; //if have other node if(*head_ref!=NULL){ (*head_ref)->pre=new_node;//一定要括弧 } //head point to new node (*head_ref)=new_node; } void printList(NODE *node){ if(node==NULL){ printf(" empty\n"); return; } //forward direction NODE *last=node; printf("forward direction:\n"); while(last->next!=NULL){//最後一個值會沒讀到,會跳出迴圈 printf("%d ",last->data); last=last->next; } printf("%d ",last->data);//印出最後一個值 printf("\n"); printf("backward direction:\n"); while(last->pre!=NULL){ printf("%d ",last->data); last=last->pre; } printf("%d ",last->data); printf("\n"); } void deleteList(NODE **head_ref){ NODE *current=*head_ref; NODE *next; //travel while(current!=NULL){ next=current->next; free(current); current=next; } *head_ref=NULL; }; int main() { NODE *head=NULL; append(&head,9); push(&head,3); push(&head,7); push(&head,10); push(&head,8); printList(head); deleteList(&head); printList(head); return 0; } ``` ## Stack in SLL ```c= #include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }NODE; NODE *newNode(int key){ NODE *node=(NODE*)malloc(sizeof(NODE)); node->next=NULL; node->data=key; return node; } void push(NODE **top_ref,int key){ NODE *node=newNode(key); //node before head node->next=(*top_ref); //head is node (*top_ref)=node; } void Top(NODE *top){ printf("%d\n",top->data); } void Pop(NODE **top_ref){ if (*top_ref == NULL) return; NODE *current=(*top_ref); (*top_ref)=current->next; free(current); return; } void printStack(NODE *top){ NODE *curr=top; while(curr!=NULL){ printf("%d",curr->data); curr=curr->next; } printf("\n"); } int empty(NODE *top){ return (top==NULL); } int size(NODE *top){ int cnt=0; while(top){ cnt++; top=top->next; } return cnt; } int main() { NODE *top=NULL; push(&top,3); push(&top,2); push(&top,1); printStack(top); Top(top); Pop(&top);//don't forget & printStack(top); printf("size:%d\n",size(top)); empty(top)?printf("Empty"):printf("Have value"); return 0; } ``` ## Queue in SLL ```c= #include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }NODE; //use for point to front and rear typedef struct queue{ NODE *front,*rear; }Queue; Queue *newQueue(){ //initilize Queue Queue *q=(Queue*)malloc(sizeof(Queue)); q->front=NULL; q->rear=NULL; return q; } NODE *newNode(int key){ NODE *node=(NODE*)malloc(sizeof(NODE)); node->next=NULL; node->data=key; return node; } void enQueue(Queue *q,int key){ NODE *node=newNode(key); //no node in queue if(q->rear==NULL){ q->front=node; q->rear=node; } //the last have node,point to the next q->rear->next=node; //change rear q->rear=node; } void deQueue(Queue *q){ //no node if (q->front == NULL) return; //create temp NODE *temp=q->front; //change front q->front=q->front->next; //free free(temp); } void front(Queue *q){ if(q==NULL) return; printf("%d\n",q->front->data); } void rear(Queue *q){ if(q==NULL) return; printf("%d\n",q->rear->data); } void printQueue(Queue *q){ NODE *curr=q->front; while(curr!=NULL){ printf("%d",curr->data); curr=curr->next; } printf("\n"); } int main() { Queue *q=newQueue(); enQueue(q,1); enQueue(q,2); enQueue(q,3); printQueue(q); front(q); rear(q); deQueue(q); printQueue(q); return 0; } ```