Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct _node
- {
- int data;
- struct _node* next;
- };
- typedef struct _node node;
- node* getnode () /* 此函數產生一個新節點 */
- {
- node *p;
- p = (node *) malloc(sizeof(node));
- /* malloc 會動態地配置大小為sizeof 的記憶體*/
- /* sizeof 會傳回一個型態為node之值*/
- if ( p == NULL)
- {
- printf ("記憶體不足");
- return NULL;
- }
- return(p);
- }
- void freenode (node *p) /* 此函數將節點還給記憶體 */
- {
- free(p);
- }
- void freeall(node *head)
- {
- node *q = head;
- while (q != NULL)
- {
- q = q->next;
- free(head);
- head=q;
- }
- }
- node* insert_node (node *head, node *ptr, node data)
- {
- node *new_node; /* 新節點指標變數 */
- new_node = getnode(); /* 建立新節點,取得一個可用節點 */
- *new_node = data; /* 建立節點內容 */
- new_node->next = NULL; /* 設定指標初值 */
- if ( ptr == NULL ) /* 指標ptr是否是NULL */
- {
- /* 第一種情況: 插入第一個節點 */
- new_node->next = head; /* 新節點成為串列開始 */
- head = new_node;
- }
- else
- {
- if ( ptr->next == NULL ) /* 是否是串列結束 */
- /* 第二種情況: 插入最後一個節點 */
- {ptr->next = new_node;} /* 最後指向新節點 */
- else
- {
- /* 第三種情況: 插入成為中間節點 */
- new_node->next = ptr->next; /* (3) 新節點指向下一節點 (3)*/
- ptr->next = new_node; /* 節點ptr指向新節點 (4)*/
- }
- }
- return (head);
- }
- node* find_node(node *head, int num)
- {
- node *ptr;
- ptr = head; /* 指向串列起始 */
- while ( ptr != NULL ) /* 走訪串列 */
- {
- if ( ptr->data == num ) /* 找尋data */
- {return (ptr);}
- ptr = ptr->next; /* 指向下一節點 */
- }
- return (ptr);
- }
- node* delete_node(node *head, node *ptr)
- {
- node *previous; /* 指向前一節點 */
- if ( ptr == head ) /* 是否是串列開始 */
- /* 第一種情況: 刪除第一個節點 */
- {head = head->next;}
- else
- {
- previous = head;
- while ( previous->next != ptr ) /* 找節點ptr的前節點 */
- previous = previous->next;
- if ( ptr->next == NULL ) /* 是否是串列結束 */
- /* 第二種情況: 刪除最後一個節點 */
- {previous->next = NULL;} /* 最後一個節點 */
- else
- /* 第三種情況: 刪除中間節點 */
- {previous->next = ptr->next;} /* 圖(3)之步驟(1) */
- }
- freenode(ptr); /* 此函數將節點歸還給記憶體 */
- return(head);
- }
- int length (node *head ) /* 此函數計算節點之鏈結長度 */
- {
- int num=0;
- node *q = head;
- while (q != NULL)
- {
- num ++;
- q = q->next;
- }
- return(num);
- }
- int main()
- {
- node n;
- node *ptr,*head;
- head = NULL;
- ptr=NULL;
- while(1)
- {
- /*
- printf("i 插入\n");
- printf("l 列印\n");
- printf("d 刪除\n");
- printf("f 尋找\n");
- printf("q 離開\n");
- */
- //char key;
- int key;
- int value;
- fflush(stdin); //用scanf還是會遇到暫存區問題
- //key = getchar();
- scanf("%d",&key);
- switch(key)
- {
- //case 'i'://insert
- case 1:
- scanf("%d", &value);
- n.data = value;
- ptr=head;
- if (head==NULL)
- {
- head = insert_node(head,NULL,n);
- }
- else
- {
- while (ptr->next !=NULL)
- {ptr=ptr->next;}
- head=insert_node(head,ptr,n);
- }
- break;
- //case 'l'://print
- case 6:
- ptr=head;
- while(ptr!=NULL)
- {
- printf("%d ", ptr->data);
- ptr=ptr->next;
- }
- printf("\n");
- break;
- //case 'd'://delte
- case 2:
- scanf("%d",&value);
- ptr = find_node(head, value);
- if(ptr != NULL)
- {
- head = delete_node(head, ptr);
- printf("Delete ok\n");
- }
- else
- {printf("Can not delete\n");}
- break;
- //case 'f'://find
- case 3:
- scanf("%d",&value);
- ptr = find_node(head, value);
- if(ptr != NULL)
- {printf("found %d\n", ptr->data);}
- else
- {printf("Not found\n");}
- break;
- //case 'q':
- case 4:
- freeall(head);
- return 0;
- case 5:
- if(head!=NULL)
- {printf("%d\n",length(head));}
- else
- {printf("0");}
- break;
- case 'c':
- printf("要插入後方的節點:");
- scanf("%d",&vakye);
- ptr=find_node(head,value);
- if(ptr!=null)
- {
- scanf("%d",&vakye);
- n.data=value;
- head=insert_node(head,ptr,value);
- }
- }
- //system("pause");
- //system("cls");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement