您好,登錄后才能下訂單哦!
/* * @Author: suifengtec * @Date: 2017-09-02 16:06:33 * @Last Modified by: suifengtec * @Last Modified time: 2017-09-02 20:47:13 **/ /* 字符單向鏈表 gcc -o a.exe main.c && a */ #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 聲明一個自包含結構體listNode,并把它定義為類型 ListNode typedef struct listNode{ char data; struct listNode *nextPtr; } ListNode; // 為 ListNode 的指針定義一個類型 ListNodePtr typedef ListNode *ListNodePtr; // 引導說明 void bootstrap(void); // 插入到鏈表,這里按照字符的 ASCII 碼插入 // 參數分別為當前節點的指針和元素的值 void insert(ListNodePtr *sPtr, char value); // 鏈表是否為空 bool isEmpty(ListNodePtr sPtr); // 從鏈表中刪除特定的元素值,返回是否刪除成功的布爾值 // 每次只刪除1個,即使鏈表中有兩個AA, 在 value 為 A 時, 也只刪除第一個 bool delete(ListNodePtr *sPtr, char value); // 打印鏈表 void printList(ListNodePtr currentPtr); int main(void) { // 起始指針/當前指針 ListNodePtr startPtr = NULL; // 在引導說明中已經說明了,只能取1,2,3 中的一個值,其它的整數將會被認為是字符 unsigned int choice; // 字符 char item; // 引導說明 bootstrap(); // 獲取用戶輸入的 1 或 2 或 3 或者字符,或者無空格的不含1和2和3的字符串 printf("%s","?"); scanf("%u", &choice); // 不為3 時 while(choice!=3){ switch(choice){ // 1 表示向鏈表中插入字符 case 1: /* 每次輸入一個字符 還支持輸入一個不含空格的字符串 如 HelloChina! 鏈表為 !-->C-->H-->a-->h-->i-->i-->NULL */ printf("%s","Enter a character:"); scanf("\n%c", &item); insert(&startPtr,item); printList(startPtr); break; // 2 表示從鏈表中刪除字符,鏈表為空或者沒有要刪除的字符時,給出錯誤提示。 //如果這個字符串中的字符全都存在于鏈表的話 // 也可以一次性刪除輸入的不含1和2和3的不含空格的字符串, case 2: if(!isEmpty(startPtr)){ printf("%s","Enter a character to be deleted:"); scanf("\n%c", &item); if(delete(&startPtr, item)){ printf("\'%c\' has be deleted.\n", item); printList(startPtr); }else{ printf("not found \'%c\'\n", item); } } else{ puts("the list is empty?"); } break; // 后備,因為不可能到這里的 case 3: puts("invalid option!"); bootstrap(); break; } /*bootstrap();*/ printf("%s","?"); scanf("%u", &choice); } return 0; } void bootstrap(void) { printf( "Enter your choice:\n" "1 = insert an element to the list\n" "2 = delete an element from the list\n" "3 = Game Over.\n" ); } void insert( ListNodePtr *sPtr, char value ) { ListNodePtr newPtr = malloc(sizeof(ListNode)); if( newPtr != NULL ){ newPtr->data = value; newPtr->nextPtr = NULL; ListNodePtr prePtr = NULL; ListNodePtr currentPtr = *sPtr; while( currentPtr != NULL && value > currentPtr->data){ prePtr = currentPtr; currentPtr = currentPtr->nextPtr; } if(prePtr==NULL){ newPtr->nextPtr = *sPtr; *sPtr = newPtr; }else{ prePtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } }else{ printf("%c not inserted. No memory availabe.\n", value); } } bool delete(ListNodePtr *sPtr, char value) { if(value == (*sPtr)->data){ ListNodePtr tmpPtr = *sPtr; *sPtr = (*sPtr)->nextPtr; free(tmpPtr); return true; } else{ ListNodePtr prePtr = *sPtr; ListNodePtr currentPtr = (*sPtr)->nextPtr; while(currentPtr != NULL && currentPtr->data != value){ prePtr = currentPtr; currentPtr = currentPtr->nextPtr; } if(currentPtr!=NULL){ ListNodePtr tmpPtr = currentPtr; prePtr->nextPtr = currentPtr->nextPtr; free(tmpPtr); return true; } } return false; } bool isEmpty(ListNodePtr sPtr) { return sPtr == NULL?true:false; } void printList(ListNodePtr currentPtr) { if(isEmpty(currentPtr)){ puts("List is empty?"); } else{ puts("The list is :\n"); while(currentPtr->nextPtr!=NULL){ printf("%c-->", currentPtr->data); currentPtr = currentPtr->nextPtr; } puts("NULL\n"); } } /*EOF*/
單向字符鏈表的C語言實現。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。