Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- struct _node
- {
- char name[20];
- char phone[20];
- 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, char *name)
- {
- node *ptr;
- ptr = head; /* 指向串列起始 */
- while ( ptr != NULL ) /* 走訪串列 */
- {
- if (stricmp(ptr->name, name)==0) /* 找尋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->next!= NULL)
- {
- num ++;
- q = q->next;
- }
- return(num);
- }
- node* sorting_node(node *head, node *n)
- //把n跟現有的node交換
- {
- node *ptr;
- node *temp;
- ptr = head; /* 指向串列起始 */
- while(ptr!=NULL)
- {
- if (stricmp(n->name,ptr->name)<0)
- {
- temp=ptr;
- strcpy(ptr->name,n->name);
- strcpy(ptr->phone,n->phone);
- strcpy(n->name,temp->name);
- strcpy(n->phone,temp->phone);
- return (ptr);
- }
- ptr=ptr->next;
- }
- return (ptr);
- }
- 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;
- char value[20];
- fflush(stdin); //用scanf還是會遇到暫存區問題
- key = getchar();
- //scanf("%d",&key);
- switch(key)
- {
- //case 0:
- case 'q'://quit
- freeall(head);
- return 0;
- case 'i'://insert
- //case 1:
- fflush(stdin);
- gets(n.name);
- fflush(stdin);
- gets(n.phone);
- ptr=head;
- if (head==NULL)
- {head = insert_node(head,NULL,n);}
- else
- {
- head=sorting_node(head,&n);
- while (ptr->next !=NULL)
- {ptr=ptr->next;}
- head=insert_node(head,ptr,n);
- }
- break;
- case 'f'://find
- //case 2:
- fflush(stdin);
- gets(value);
- ptr = find_node(head, value);
- if(ptr != NULL)
- {
- puts(ptr->name);//自帶換行
- puts(ptr->phone);
- }
- else
- {printf("Not found\n");}
- break;
- case 'd': //delete
- fflush(stdin);
- gets(value);
- ptr=find_node(head,value);
- if(ptr!=NULL)
- {head=delete_node(head,ptr);}
- break;
- case 'l'://listall&total num
- //case 4:
- ptr=head;
- printf("total num: %d\n",length(head)+1);
- while(ptr!=NULL)
- {
- puts(ptr->name);
- puts(ptr->phone);
- ptr=ptr->next;
- }
- break;
- }
- system("pause");
- system("cls");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement