中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

初識(shí)數(shù)據(jù)結(jié)構(gòu):鏈表實(shí)現(xiàn)圖書(shū)信息管理系統(tǒng)(C語(yǔ)言,僅供參考)-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃、小程序定制開(kāi)發(fā)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開(kāi)發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立十多年以來(lái),已經(jīng)為上千成都柴油發(fā)電機(jī)各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的上千客戶與我們一路同行,見(jiàn)證我們的成長(zhǎng);未來(lái),我們一起分享成功的喜悅。

1.創(chuàng)建表結(jié)構(gòu)

2.創(chuàng)建表

3.打印鏈表

4.查找功能的實(shí)現(xiàn)?

5.插入功能的實(shí)現(xiàn)

6.刪除功能的實(shí)現(xiàn)?

7.修改功能的實(shí)現(xiàn)??

8.計(jì)數(shù)功能的實(shí)現(xiàn)??

9.排序功能的實(shí)現(xiàn)?

10.封裝圖書(shū)信息管理系統(tǒng)


1.創(chuàng)建表結(jié)構(gòu)

創(chuàng)建書(shū)籍信息結(jié)構(gòu)體和每個(gè)結(jié)點(diǎn)的結(jié)構(gòu)體

struct Book
{
	char id[20];//ISBN
	char name[50];//書(shū)名
	int price;//定價(jià)
};//創(chuàng)建書(shū)籍信息結(jié)構(gòu)體
typedef struct LNode {
	struct Book data;//書(shū)籍信息結(jié)構(gòu)體
	struct LNode* next;//指向下一元素指針
}LNode,*LinkList;
2.創(chuàng)建表

前插法創(chuàng)建單鏈表,建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L

//創(chuàng)建鏈表
LinkList CreateList_H(int n) {
	LinkList L = (LinkList)malloc(sizeof(LNode));//建立一個(gè)帶頭結(jié)點(diǎn)的空鏈表
    int i;
    LinkList r;
	if (L == NULL)//判斷是否建立成功
	{
		perror("CreateList_H");
		return 0;
	}
	L->next = NULL;
	r = L;//尾指正r指向頭結(jié)點(diǎn)
	i = 0;
	for ( i = 0; i< n; i++)
	{
		LinkList p = (LinkList)malloc(sizeof(LNode));//生成新節(jié)點(diǎn)p
		if (p == NULL)//判斷是否建立成功
		{
			perror("CreateList_H");
			return 0;
		}
		scanf("%s %s %d", p->data.id, p->data.name, &(p->data.price));//輸入書(shū)籍信息賦給p結(jié)點(diǎn)上的data
		r->next = p;//r指向的結(jié)點(diǎn)next域指向p
		p->next = NULL;//p結(jié)點(diǎn)next域指針賦為空指針
		r = p;//r指針指向新節(jié)點(diǎn)
	}
	return L;//返回頭指針L
}

正序輸入數(shù)據(jù)創(chuàng)建表

3.打印鏈表

為方便測(cè)試打印鏈表中所有元素

//打印鏈表
void printList(LinkList L){
	LinkList p = L->next;//創(chuàng)建p指針指向L的首元結(jié)點(diǎn)
	printf("\n");
	while (p!=NULL)//遍歷鏈表,直到p為空
	{
		printf("%s %s %d\n", p->data.id, p->data.name, p->data.price);
		p = p->next;
	}
}
4.查找功能的實(shí)現(xiàn)?

輸入要查找書(shū)籍名,返回書(shū)籍的ISBN

//鏈表查找
LinkList LocateElem(LinkList L,char* find) {
	LinkList p = L->next;//創(chuàng)建p指針指向L的首元結(jié)點(diǎn)
	while (NULL != p && strcmp(p->data.name,find))//向后掃描,直到p為空或p指向數(shù)據(jù)域的書(shū)籍名相等
	{
		p = p->next;//p指向下一個(gè)結(jié)點(diǎn)
	}
	return p;//查找成功返回書(shū)籍地址,查找失敗返會(huì)NULL
}

測(cè)試:

int main() {
	LinkList L = CreateList_H(10);//建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L
	printList(L);//打印鏈表
	printf("輸入要查找的書(shū)名:");
	char find_name[20] = "0";
	scanf("%s", find_name);
	LinkList s = LocateElem(L, find_name);//查找書(shū)名為find_name的書(shū)籍,儲(chǔ)存查找函數(shù)返回的地址
    if(s == NULL)//判斷是否查找成功
    {
        printf("查找失敗");
        return 0;
    }
	printf(s->data.id);//打印返回書(shū)籍地址處的ISBN
	return 0;
}

運(yùn)行結(jié)果:

5.插入功能的實(shí)現(xiàn)

傳入鏈表L和準(zhǔn)備插入的位置n

要在第n個(gè)位置插入時(shí),要找到第n-1個(gè)位置結(jié)點(diǎn),插入在第n-1個(gè)位置結(jié)點(diǎn)后面。

//鏈表插入
void LinkInsert(LinkList L,int n) {
	LinkList p = L;
	int i = 0;
	for (i = 0; i< n-1; i++)//查找第n-1個(gè)結(jié)點(diǎn)
	{
		if (p == NULL)//如果p為空,則跳出循環(huán)
			break;
		p = p->next;
	}
	if (p == NULL)
	{
		printf("插入失敗");//若p為空,提示插入失敗
		return;
	}
	else
	{
		LinkList s = (LinkList)malloc(sizeof(LNode));//生成新結(jié)點(diǎn)s
		printf("輸入要插入的書(shū)籍信息:");
		scanf("%s %s %d", s->data.id, s->data.name, &(s->data.price));//在s結(jié)點(diǎn)data域存儲(chǔ)書(shū)籍信息
		s->next = p->next;
		p->next = s;
	}
}

測(cè)試:

int main() {
	LinkList L = CreateList_H(10);//建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L
	printList(L);//打印查看插入前效果
	LinkInsert(L, 4);//在鏈表L中第4個(gè)位置插入新結(jié)點(diǎn)
	printList(L);//打印查看插入后效果
	return 0;
}

運(yùn)行結(jié)果:

6.刪除功能的實(shí)現(xiàn)?

刪除第n個(gè)結(jié)點(diǎn),首先找到第n-1個(gè)結(jié)點(diǎn),臨時(shí)保存第n個(gè)結(jié)點(diǎn)地址,讓第n-1個(gè)結(jié)點(diǎn)的next域指向第n+1個(gè)結(jié)點(diǎn),再釋放第n個(gè)結(jié)點(diǎn)的空間。

//結(jié)點(diǎn)刪除
void ListDelete(LinkList L, int n) {
	LinkList p = L;
	int i = 0;
	for (i = 0; i< n-1; i++)//查找第n-1個(gè)結(jié)點(diǎn)
	{
		if (p->next == NULL)//如果p的next域?yàn)榭?,則跳出循環(huán)
			break;
		p = p->next;
	}
	if (p->next == NULL)
	{
		printf("刪除失敗");//若p為空,提示刪除失敗
		return;
	}
	else
	{
		LinkList q = p->next;//保存被刪結(jié)點(diǎn)地址以備釋放
		p->next = p->next->next;//p的next域指向被刪地址的后一個(gè)地址
		free(q);//釋放q結(jié)點(diǎn)空間
        q = NULL;//把q置為空指針
		printf("刪除成功");
		return;
	}
}

測(cè)試:

int main() {
	LinkList L = CreateList_H(10);//建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L
	printList(L);//打印查看刪除前效果
	ListDelete(L, 5);//刪除鏈表L中第5個(gè)元素
	printList(L);//打印查看刪除后效果
	return 0;
}

運(yùn)行結(jié)果:

7.修改功能的實(shí)現(xiàn)??

調(diào)用查找函數(shù)查找要修改的結(jié)點(diǎn)后修改

//修改鏈表
void modifyList(LinkList L) {
	char find_name[50] = "0";
	printf("輸入要修改結(jié)點(diǎn)的書(shū)籍名:\n");
	scanf("%s", find_name);
	LinkList p = LocateElem(L, find_name);//調(diào)用查找函數(shù),返回地址存儲(chǔ)在p指針中
	if (p == NULL)//判斷查找是否成功
	{
		printf("修改失敗,查找未完成\n");
		return;
	}
	printf("輸入修改書(shū)籍信息:\n");
	scanf("%s %s %d", p->data.id, p->data.name, &(p->data.price));//修改書(shū)籍信息
	printf("修改成功");
}

測(cè)試:

int main() {
	LinkList L = CreateList_H(10);//建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L
	printList(L);//打印鏈表
	modifyList(L);//修改
	printList(L);//打印鏈表
	return 0;
}

運(yùn)行結(jié)果:

8.計(jì)數(shù)功能的實(shí)現(xiàn)??
//計(jì)數(shù)
int countList(LinkList L) {
	LinkList p = L->next;//創(chuàng)建p指針指向L的首元結(jié)點(diǎn)
	int count = 0;//創(chuàng)建count計(jì)數(shù)
	while (p != NULL)//遍歷鏈表,直到p為空
	{
		count++;
		p = p->next;
	}
	return count;//返回count
}

測(cè)試:

int main() {
	LinkList L = CreateList_H(10);//建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L
	//printList(L);//打印鏈表
	int count = countList(L);//返回元素個(gè)數(shù)
	printf("鏈表元素個(gè)數(shù)為%d\n", count);
	//printList(L);//打印鏈表
	return 0;
}

運(yùn)行結(jié)果:

9.排序功能的實(shí)現(xiàn)?

使用冒泡排序的方法,比較兩個(gè)結(jié)點(diǎn)data.id域的字符串,詳情可查看冒泡排序(超詳細(xì))

函數(shù)strcmp的功能是比較兩個(gè)字符串的大小。也就是把兩個(gè)字符串從首字符開(kāi)始逐個(gè)字符的進(jìn)行比較,直到某個(gè)字符不相同或者其中一個(gè)字符串比較完畢才停止比較。字符的比較為ASCII碼的比較。

//排序鏈表
void sortList(LinkList L) {
	int count = countList(L);//調(diào)用計(jì)數(shù)函數(shù)計(jì)算鏈表元素個(gè)數(shù)n
	int i = 0;
	for (i = 0; i< count - 1; i++)//外層循環(huán),遍歷n-1個(gè)元素
	{
		int num = count - 1 - i;//記錄內(nèi)層循環(huán)所需次數(shù)
		LinkList p = L->next;//令p指向L的首元結(jié)點(diǎn)
		LinkList q = p->next;//令q指向p的下一個(gè)結(jié)點(diǎn)
		LinkList tail = L;//L儲(chǔ)存p的前一個(gè)結(jié)點(diǎn)
		while (num--)//內(nèi)層循環(huán)
		{
			if (strcmp((p->data.id), (q->data.id)) >0)//調(diào)用strcmp函數(shù)比較p結(jié)點(diǎn)和q結(jié)點(diǎn)的data.id域內(nèi)的字符串
			{
				//交換p結(jié)點(diǎn)和q結(jié)點(diǎn)
				p->next = q->next;
				q->next = p;
				tail->next = q;
			}
			tail = tail->next;//tail指向下一結(jié)點(diǎn)
			p = tail->next;//p指向tail的下一結(jié)點(diǎn)
			q = p->next;//q指向p的下一結(jié)點(diǎn)
		}
	}
	printf("排序完成!\n");
}

測(cè)試:

int main() {
	LinkList L = CreateList_H(10);//建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L
	printList(L);//打印鏈表
	sortList(L);//排序
	printList(L);//打印鏈表
	return 0;
}

運(yùn)行結(jié)果:

10.封裝圖書(shū)信息管理系統(tǒng)
void menu()
{
	printf("********************************\n");
	printf("*****   1.打印    2.查找   *****\n");
	printf("*****   3.插入    4.刪除   *****\n");
	printf("*****   5.修改    6.計(jì)數(shù)   *****\n");
	printf("*****   7.排序    0.退出   *****\n");
	printf("********************************\n");
}
int main()
{
	LinkList L = CreateList_H(10);//建立n個(gè)元素的鏈表,正序輸入書(shū)籍信息,返回頭指針L
	int input = 0;//儲(chǔ)存輸入的值
	int n = 0;
	do
	{
		menu();//打印菜單
		printf("請(qǐng)選擇:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("打印:\n");
			printList(L);//打印鏈表
			break;
		case 2:
			printf(""); printf("輸入要查找的書(shū)名:");
			char find_name[20] = "0";
			scanf("%s", find_name);
			LinkList s = LocateElem(L, find_name);//查找書(shū)名為find_name的書(shū)籍,儲(chǔ)存查找函數(shù)返回的地址
			if(s == NULL)//判斷是否查找成功
			{
				printf("查找失敗");
				return 0;
			}
			printf(s->data.id);//打印返回書(shū)籍地址處的ISBN
			printf("\n");
			break;
		case 3:
			printf("輸入要插入的位置:");
			scanf("%d", &n);
			LinkInsert(L, n);//在鏈表L中第4個(gè)位置插入新結(jié)點(diǎn)
			break;
		case 4:
			printf("輸入要?jiǎng)h除的位置:");
			scanf("%d", &n);
			ListDelete(L, n);//刪除鏈表L中第5個(gè)元素
			break;
		case 5:
			modifyList(L);//修改
			break;
		case 6: 
		{
			int count = countList(L);//返回元素個(gè)數(shù)
			printf("鏈表元素個(gè)數(shù)為%d\n", count);
			break;
		}
		case 7:
			sortList(L);//排序
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("輸入錯(cuò)誤,請(qǐng)重新選擇:\n");
			break;
		}
	} while (input);//輸入值為0時(shí)退出
	return 0;
}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞標(biāo)題:初識(shí)數(shù)據(jù)結(jié)構(gòu):鏈表實(shí)現(xiàn)圖書(shū)信息管理系統(tǒng)(C語(yǔ)言,僅供參考)-創(chuàng)新互聯(lián)
本文URL:http://m.rwnh.cn/article28/espcp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、標(biāo)簽優(yōu)化、面包屑導(dǎo)航網(wǎng)站營(yíng)銷(xiāo)、App開(kāi)發(fā)、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
比如县| 晋城| 南宁市| 牡丹江市| 株洲市| 抚远县| 连江县| 宾川县| 缙云县| 嫩江县| 渝中区| 庄河市| 二手房| 汕尾市| 拜城县| 云浮市| 喜德县| 澄城县| 永善县| 长阳| 金堂县| 浪卡子县| 鹤峰县| 青铜峡市| 西盟| 怀安县| 运城市| 潢川县| 明溪县| 旬邑县| 米脂县| 平利县| 鲁山县| 封开县| 廉江市| 西平县| 灵石县| 庆云县| 尉犁县| 微博| 宝兴县|