1. 程式人生 > >C語言之字符單向鏈表

C語言之字符單向鏈表

c 鏈表

/*
* @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語言之字符單向鏈表