C语言之字符单向链表
2017-09-02 21:07
369 查看
/* * @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语言实现。
相关文章推荐
- C语言单向链表的实现
- C语言初级链表(之有头节点的单向链表)
- c语言的单向链表理解
- c语言用尾递归实现单向链表的逆向排列
- 单向链表(C语言实现)学习记录
- 用C语言写一个单向链表
- 写给过去的自己-No.1-数据结构篇-单向链表C语言的实现
- c语言:单向循环链表的实现
- 数据结构实验二 链式存储结构----单向链表的有关操作(学生成绩信息C语言)
- 单向链表的C语言实现与基本操作
- C语言单向链表的创建、释放、插入、删除、翻转操作练习
- 转载的标准文档:C语言实现一个简单的单向链表list
- C语言单向链表的建立
- C语言单向链表的建立
- C语言创建单向链表之正向建链
- C语言数据结构:单向链表
- c语言实现单向循环链表
- 尾插法建立单向链表 C语言实现
- C语言实现链表之单向链表(八)删除尾结点
- C语言单向循环链表解决约瑟夫问题