国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼)

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

??個(gè)人主頁(yè):小新_-

??個(gè)人座右銘:“成功者不是從不失敗的人,而是從不放棄的人!”??

??歡迎各位→點(diǎn)贊?? + 收藏?? + 留言??

??所屬專欄:?話說(shuō)那些與C++的愛(ài)恨情仇 ? 歡迎訂閱,持續(xù)更新中~~~

??數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ???讓小新帶著你快樂(lè)的學(xué)習(xí)吧~?

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

目錄

1、線性表的定義

2、順序表分類

3.動(dòng)態(tài)順序表的實(shí)現(xiàn)

準(zhǔn)備工作

1、文件的準(zhǔn)備

2、順序表的定義

3、擴(kuò)容

4、打印當(dāng)前順序表

1、初始化和銷毀

2、插入

2.1尾插

2.2頭插

2.3任意位置之前插入

3、刪除

3.1頭刪

3.2尾刪

3.3任意位置刪除

4、查找表中元素

完整代碼

4、基于順序表實(shí)現(xiàn)通訊錄項(xiàng)目

4.1功能要求

4.2通訊錄初始化

4.3添加聯(lián)系人

4.4查看某聯(lián)系人是否存在

4.5刪除聯(lián)系人

4.6打印通訊錄

4.7修改聯(lián)系人

4.7查找聯(lián)系人

完整代碼

5、經(jīng)典順序表OJ

1.經(jīng)典算法OJ題1:?移除元素(點(diǎn)擊進(jìn)入題目)

2.經(jīng)典算法OJ題2:?合并倆個(gè)有序數(shù)組(點(diǎn)擊進(jìn)入題目)

6. 順序表的問(wèn)題及思考


【知識(shí)框架】

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

1、線性表的定義


線性表(List):零個(gè)或多個(gè)數(shù)據(jù)元素的有限序列。

線性表的數(shù)據(jù)集合為{a1,a2,…,an},假設(shè)每個(gè)元素的類型均為DataType。其中,除第一個(gè)元素a1外,每一個(gè)元素有且只有一個(gè)直接前驅(qū)元素,除了最后一個(gè)元素an外,每一個(gè)元素有且只有一個(gè)直接后繼元素。數(shù)據(jù)元素之間的關(guān)系是一對(duì)一的關(guān)系。
數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

線性表特點(diǎn):

  • 元素個(gè)數(shù)有限
  • 元素具有先后順序(邏輯上的先后順序)
  • 表中每個(gè)元素都是數(shù)據(jù)元素,每個(gè)元素都是單個(gè)元素
  • 表中元素的數(shù)據(jù)類型相同(意味著每個(gè)元素占用存儲(chǔ)空間大小一樣)
  • 表中元素具有抽象性,僅討論元素間的邏輯關(guān)系,而不考慮元素究竟表示什么內(nèi)容

注意:線性表是一種邏輯結(jié)構(gòu),表示元素間一對(duì)一的相鄰關(guān)系。順序表、鏈表是指存儲(chǔ)結(jié)構(gòu)

2、順序表分類

? 順序表和數(shù)組的區(qū)別
? 順序表的底層結(jié)構(gòu)是數(shù)組,對(duì)數(shù)組的封裝,實(shí)現(xiàn)了常?的增刪改查等接?
? 順序表分類
靜態(tài)順序表:
數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

動(dòng)態(tài)順序表:

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

3.動(dòng)態(tài)順序表的實(shí)現(xiàn)

準(zhǔn)備工作

1、文件的準(zhǔn)備

首先我們創(chuàng)建三個(gè)文件,一個(gè)是sqlist.c用于實(shí)現(xiàn)各種函數(shù)接口,一個(gè)為sqlist.h用于放置函數(shù)聲明,另外一個(gè)test.c用于測(cè)試函數(shù)的正確性。他們?nèi)齻€(gè)文件最后鏈接實(shí)現(xiàn)我們的動(dòng)態(tài)順序表。

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

要實(shí)現(xiàn)的函數(shù)接口,就放在下面啦!

sqlist.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//動(dòng)態(tài)順序表
typedef int SLDataType;
typedef struct Seqlist {
	SLDataType* arr;//數(shù)據(jù)
	int capacity;//順序表空間大小
	int size;//有效數(shù)據(jù)個(gè)數(shù)
}SL;
void SLInit(SL* ps);
void SLDestroy(SL* ps);
void SLPrint(SL* ps); //保持接口一致性

//順序表的頭部/尾部插入
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);

//順序表的頭部/尾部刪除
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);

//指定位置之前插入數(shù)據(jù)
//刪除指定位置數(shù)據(jù)
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);

2、順序表的定義

首先在順序表.h的文件里,把順序表這個(gè)結(jié)構(gòu)體先定義下來(lái),定義完后,可以用typedef改名,然后,我們要想這個(gè)數(shù)組里必須是int型的嗎,不一定,那我就用typedef提前把int重類型一下,這樣我們就可以不僅僅停留在int,若想改成其他類型,直接在typedef后將int改成你想在順序表放的類型就可以了。

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

3、擴(kuò)容

在插入之前我們要想咱們現(xiàn)在初始化容量數(shù)為0,得擴(kuò)容呀,那我們就擴(kuò)容定義\n\n如何來(lái)擴(kuò)容那,我們一般規(guī)定擴(kuò)容到原空間的兩倍,擴(kuò)容用到的函數(shù)是realloc函數(shù),但剛開始是0,我們可以用三目操作符來(lái)判斷如果空間為0,我們要給它4個(gè)空間數(shù),若不是0,直接capacity乘2,接著再使用新的容量數(shù)乘每個(gè)類型的字節(jié)數(shù)放到realloc里就是開辟了新的空間。至于為什么是2,有相當(dāng)嚴(yán)格的證明,這里不再贅述。

代碼如下:

void SLCheckCapacity(SL* ps)//判斷是否擴(kuò)容
{
	if (ps->capacity == ps->size)
	{//擴(kuò)容
		int newcapacity = ps->capacity = 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, 2 * newcapacity*sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		//擴(kuò)容成功
		ps->arr = tmp;
		ps->capacity = newcapacity;

	}
}

4、打印當(dāng)前順序表

邏輯比較簡(jiǎn)單,不再贅述

代碼如下:

void SLPrint(SL* ps) //打印
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

1、初始化和銷毀

分析:

初始化十分簡(jiǎn)單,將數(shù)組置為空,因?yàn)榇藭r(shí)沒(méi)有數(shù)據(jù)。順序表的空間大小和有效數(shù)據(jù)個(gè)數(shù)置為0。我們的初始化就完成了。

void SLInit(SL* ps)//初始化
{
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

分析:銷毀基本和初始化差不多,俗話說(shuō)一切回到原點(diǎn),只不過(guò)為了健壯性要斷言ps指針,然后將其空間歸還給操作系統(tǒng)。

void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

2、插入

2.1尾插

分析:

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

尾插比較簡(jiǎn)單,空間足夠,直接在順序表尾部插入即可。不夠就得先擴(kuò)容,再插入

代碼如下:

void SLPushBack(SL* ps, SLDataType x)//尾插
{
	assert(ps);
	SLCheckCapacity(ps);
	
	ps->arr[ps->size] = x;
	ps->size++;
}

2.2頭插

分析:

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

頭插,我們要先將原來(lái)的數(shù)據(jù)整體往后挪動(dòng)一位,這要通過(guò)一個(gè)for循環(huán)來(lái)實(shí)現(xiàn),然后讓頭結(jié)點(diǎn)的值等于我們要賦予的值。如果空間不夠,就得先擴(kuò)容

代碼如下:

void SLPushFront(SL* ps, SLDataType x)//頭插
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i-1];
	}
	ps->arr[0] = x;
	ps->size++;
}

2.3任意位置之前插入

分析:

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

首先,要?jiǎng)h除的順序表不能為空。再通過(guò)for循環(huán)讓pos位置以及pos之后的元素向后挪動(dòng)一位,再講pos位置賦值為要給定的值即可

代碼如下:

void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	SLCheckCapacity(ps);
	for (int i =  ps->size ;i>pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}

3、刪除

3.1頭刪

分析:

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

首先,刪除的順序表肯定不為空,在通過(guò)for循環(huán)將元素整體往前挪動(dòng)一位,有效數(shù)據(jù)個(gè)數(shù)size-1即可

代碼如下:

void SLPopFront(SL* ps)
{
	assert(ps);
	for (int i = 0; i < ps->arr[ps->size-1]; i++)
	{
		ps->arr[i] = ps->arr[i +1];
	}
	ps->size--;
}

3.2尾刪

分析:

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

尾刪其實(shí)很簡(jiǎn)單,只需將尾部元素置為0,size--即可。當(dāng)然,順序表為空,不能執(zhí)行刪除操作,所以要判斷一下。

代碼如下:

void SLPopBack(SL* ps)//尾部刪除
{
	assert(ps);
	assert(ps->size);
	ps->arr[ps->size] = 0;
	ps->size--;
}

3.3任意位置刪除

分析:

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

邏輯比較簡(jiǎn)單,首先判斷是否為空。然后讓pos之后的數(shù)據(jù)往前挪動(dòng)一位,這樣數(shù)據(jù)會(huì)被覆蓋,也就完成了刪除的效果。

代碼如下:

void SLErase(SL* ps, int pos)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = pos; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}


4、查找表中元素

分析:遍歷順序表,找到了就返回元素下標(biāo),沒(méi)找到返回-1.

代碼如下:

int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

完整代碼

sqlist.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"sqlist.h"
#include<assert.h>
void SLInit(SL* ps)//初始化
{
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}
void SLCheckCapacity(SL* ps)//判斷是否擴(kuò)容
{
	if (ps->capacity == ps->size)
	{//擴(kuò)容
		int newcapacity = ps->capacity = 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, 2 * newcapacity*sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		//擴(kuò)容成功
		ps->arr = tmp;
		ps->capacity = newcapacity;

	}
}
void SLPushBack(SL* ps, SLDataType x)//尾插
{
	assert(ps);
	SLCheckCapacity(ps);
	
	ps->arr[ps->size] = x;
	ps->size++;

}
void SLPushFront(SL* ps, SLDataType x)//頭插
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i-1];
	}
	ps->arr[0] = x;
	ps->size++;
}
void SLPopBack(SL* ps)//尾部刪除
{
	assert(ps);
	assert(ps->size);
	ps->arr[ps->size] = 0;
	ps->size--;
}
void SLPopFront(SL* ps)
{
	assert(ps);
	for (int i = 0; i < ps->arr[ps->size-1]; i++)
	{
		ps->arr[i] = ps->arr[i +1];
	}
	ps->size--;
}
void SLPrint(SL* ps) //打印
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}
//指定位置之前插入數(shù)據(jù)
//刪除指定位置數(shù)據(jù)
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	SLCheckCapacity(ps);
	for (int i =  ps->size ;i>pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}
void SLErase(SL* ps, int pos)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = pos; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}
void SLDestroy(SL* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->capacity = ps->size = 0;

}

4、基于順序表實(shí)現(xiàn)通訊錄項(xiàng)目

通訊錄就是給順序表套一層殼,實(shí)際上還是順序表。只不過(guò)里面的數(shù)據(jù)類型變成了一個(gè)結(jié)構(gòu)體

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

手機(jī)通訊錄其實(shí)就是一個(gè)順序表,順序表的每一個(gè)成員都是一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體中包含聯(lián)系人的

名字、性別、年齡、電話、地址等信息,只不過(guò)我們之前建立的順序表里存儲(chǔ)的是整形數(shù)據(jù),而通訊錄里存儲(chǔ)的是結(jié)構(gòu)體類型而已。

所以我們還要?jiǎng)?chuàng)建一個(gè)結(jié)構(gòu)體來(lái)存儲(chǔ)聯(lián)系人信息。

#define MAX_NAME 20
#define MAX_GENDER 10
#define MAX_PHONE 20
#define MAX_ADDR 30
typedef struct contacts?
{
?? ?char name[MAX_NAME];
?? ?char gender[MAX_GENDER];
?? ?int age;
?? ?char phone[MAX_PHONE];
?? ?char addr[MAX_ADDR];
}contacts;


?既然通訊錄就是順序表,那我們可以給順序表改類型一個(gè)名字

struct SList;
typedef struct SList CON;

4.1功能要求


1)?少能夠存儲(chǔ)100個(gè)?的通訊信息

2)能夠保存??信息:名字、性別、年齡、電話、地址等

3)增加聯(lián)系?信息

4)刪除指定聯(lián)系?

5)查找制定聯(lián)系?

6)修改指定聯(lián)系?

7)顯示聯(lián)系?信息

4.2通訊錄初始化


void ContactInit(CON* con)
{
?? ?SlInit(con);
}
通訊錄的初始化也就是順序表的初始化,我們直接調(diào)用之前的順序表初始化函數(shù)即可。

4.3添加聯(lián)系人

void AddContact(CON* con)
{
?? ?contacts f;
?? ?printf("請(qǐng)輸入要添加的聯(lián)系人姓名:");
?? ?scanf("%s", f.name);
?? ?printf("請(qǐng)輸入要添加的聯(lián)系人性別:");
?? ?scanf("%s", f.gender);
?? ?printf("請(qǐng)輸入要添加的聯(lián)系人年齡:");
?? ?scanf("%d", &f.age);
?? ?printf("請(qǐng)輸入要添加的聯(lián)系人電話:");
?? ?scanf("%s", f.phone);
?? ?printf("請(qǐng)輸入要添加的聯(lián)系人住址:");
?? ?scanf("%s", f.addr);
?? ?AddTail(con, f);
}


我們先定義一個(gè)聯(lián)系人結(jié)構(gòu)體,再添加聯(lián)系人信息,最后調(diào)用尾插函數(shù),把聯(lián)系人尾插到通訊錄中。

4.4查看某聯(lián)系人是否存在

int FundByContact(CON* con, char name[])
{
?? ?assert(con);
?? ?for (int i = 0; i < con->size; i++)
?? ?{
?? ??? ?if (0 == strcmp(con->arr[i].name, name))
?? ??? ?{
?? ??? ??? ?return i;
?? ??? ?}
?? ?}
?? ?return -1;
}


遍歷數(shù)組,如果遍歷到了要查找的聯(lián)系人的名字,就返回?cái)?shù)組成員下標(biāo),否則返回一個(gè)小于0的數(shù)。

4.5刪除聯(lián)系人

void DelContact(CON* con)
{
?? ?assert(con);
?? ?char name[MAX_NAME];
?? ?printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名:\n");
?? ?scanf("%s", name);
?? ?int fund = FundByContact(con, name);
?? ?if (fund < 0)
?? ?{
?? ??? ?printf("該聯(lián)系人不存在");
?? ?}
?? ?SpeLocDel(con, fund);
}


調(diào)用FundByContact函數(shù),如果要?jiǎng)h除的聯(lián)系人存在,那么返回?cái)?shù)組下標(biāo),在調(diào)用SpeLocDel函數(shù),刪除改下表對(duì)應(yīng)的聯(lián)系人。

4.6打印通訊錄

void PrintContact(CON* con)
{
?? ?printf("姓名 ?性別 ?年齡 ?電話 ?住址\n");
?? ?for (int i = 0; i < con->size; i++)
?? ?{
?? ??? ?printf("%s %s %d %s %s\n",
?? ??? ??? ?con->arr[i].name,
?? ??? ??? ?con->arr[i].gender,
?? ??? ??? ?con->arr[i].age,
?? ??? ??? ?con->arr[i].phone,
?? ??? ??? ?con->arr[i].addr);
?? ?}
}


遍歷數(shù)組,打印結(jié)構(gòu)體成員信息。

4.7修改聯(lián)系人 ?

void ModifyContact(CON* con)
{
?? ?char name[MAX_NAME];
?? ?printf("請(qǐng)輸入要修改的聯(lián)系人姓名");
?? ?scanf("%s", name);
?? ?int fund = FundByContact(con, name);
?? ?if (fund < 0)
?? ?{
?? ??? ?printf("該聯(lián)系人不存在");
?? ?}
?? ?printf("請(qǐng)輸入新的聯(lián)系人姓名:\n");
?? ?scanf("%s", con->arr[fund].name);
?
?? ?printf("請(qǐng)輸入新的聯(lián)系人性別:\n");
?? ?scanf("%s", con->arr[fund].gender);
?
?? ?printf("請(qǐng)輸入新的聯(lián)系人年齡:\n");
?? ?scanf("%d", &con->arr[fund].age);
?
?? ?printf("請(qǐng)輸入新的聯(lián)系人電話:\n");
?? ?scanf("%s", con->arr[fund].phone);
?
?? ?printf("請(qǐng)輸入新的聯(lián)系人住址:\n");
?? ?scanf("%s", con->arr[fund].addr);
?
}

如果要修改的聯(lián)系人存在,用fund接收返回的下標(biāo),再通過(guò)下標(biāo)修改聯(lián)系人信息。

4.7查找聯(lián)系人

void FundContact(CON* con)
{
?? ?assert(con);
?? ?char name[MAX_NAME];
?? ?printf("請(qǐng)輸入要查找的聯(lián)系人姓名:\n");
?? ?scanf("%s", name);
?? ?int fund = FundByContact(con, name);
?? ?if (fund < 0)
?? ?{
?? ??? ?printf("該聯(lián)系人不存在");
?? ?}
?? ?printf("%s %s %d %s %s\n",
?? ?con->arr[fund].name,
?? ?con->arr[fund].gender,
?? ?con->arr[fund].age,
?? ?con->arr[fund].phone,
?? ?con->arr[fund].addr);
}

如果要查找的聯(lián)系人存在,打印該聯(lián)系人的信息。

完整代碼

contest.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
#include"sqlist.h"
#include<string.h>
void ContactInit(Contact* pcon)//實(shí)際初始化的還是順序表
{
	SLInit(pcon);
}
void ContactDesTroy(Contact* pcon)
{
	SLDestroy(pcon);
}
//增加、刪除、修改、查找、查看通訊錄
int FindByName(Contact* pcon,char name[])
{
	for (int i = 0; i < pcon->size; i++)
	{
		if (strcmp(pcon->arr->name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void ContactAdd(Contact* pcon)
{
	Info info;
	printf("請(qǐng)輸入聯(lián)系人姓名:\n");
	scanf("%s", info.name);
	printf("請(qǐng)輸入聯(lián)系人年齡:\n");
	scanf("%d", &info.age);
	printf("請(qǐng)輸入聯(lián)系人性別:\n");
	scanf("%s", info.gender);
	printf("請(qǐng)輸入聯(lián)系人住址:\n");
	scanf("%s", info.addr);
	printf("請(qǐng)輸入聯(lián)系人電話:\n");
	scanf("%s", info.tel);
	SLPushBack(pcon, info);
}
void ContactDel(Contact* pcon)
{
	//刪除之前一定要先查找
	//找到了,可以刪除
	//找不到,不能執(zhí)行刪除
	printf("請(qǐng)輸入要?jiǎng)h除的聯(lián)系人姓名:\n");
	char name[NAME_MAX];
	scanf("%s", name);

	int findIndex = FindByName(pcon, name);
	if (findIndex < 0) {
		printf("要?jiǎng)h除的聯(lián)系人不存在!\n");
		return;
	}
	//執(zhí)行刪除操作
	SLErase(pcon, findIndex);
	printf("聯(lián)系人刪除成功!\n");
}
void ContactModify(Contact* pcon)
{
	char name[NAME_MAX];
	printf("請(qǐng)輸入要修改的聯(lián)系人姓名:\n");
	scanf("%s", name);

	int findIndex = FindByName(pcon, name);
	if (findIndex < 0)
	{
		printf("要修改的聯(lián)系人不存在!\n");
		return;
	}
	//找到了,執(zhí)行修改操作
		//int arr[10]   int arr[findIndex] = 100
		printf("請(qǐng)輸入姓名:\n");
	scanf("%s", pcon->arr[findIndex].name);
	printf("請(qǐng)輸入年齡:\n");
	scanf("%d", &pcon->arr[findIndex].age);
	printf("請(qǐng)輸入性別:\n");
	scanf("%s", pcon->arr[findIndex].gender);
	printf("請(qǐng)輸入電話:\n");
	scanf("%s", pcon->arr[findIndex].tel);
	printf("請(qǐng)輸入地址:\n");
	scanf("%s", pcon->arr[findIndex].addr);

	printf("聯(lián)系人修改成功!\n");
}
void ContactFind(Contact* pcon)
{
	char name[NAME_MAX];
	printf("請(qǐng)輸入要查找的用戶姓名:\n");
	scanf("%s", name);

	int findIndex = FindByName(pcon, name);
	if (findIndex < 0) {
		printf("該聯(lián)系人不存在!\n");
		return;
	}
	//找到了,打印一下查找的聯(lián)系人信息
	printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "住址");
	printf("%s %s %d %s %s\n",
		pcon->arr[findIndex].name,
		pcon->arr[findIndex].gender,
		pcon->arr[findIndex].age,
		pcon->arr[findIndex].tel,
		pcon->arr[findIndex].addr
	);
}

void ContactShow(Contact* pcon)
{
	printf("%s %s %s %s %s\n", "姓名", "性別", "年齡", "電話", "住址");

	for (int i = 0; i < pcon->size; i++)
	{
		printf("%s %s %d %s %s\n",
			pcon->arr[i].name,
			pcon->arr[i].gender,
			pcon->arr[i].age,
			pcon->arr[i].tel,
			pcon->arr[i].addr
		);
	}
}

contest.h

#pragma once
#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 100
#include<stdio.h>//暫時(shí)加上
//通訊錄數(shù)據(jù)類型
typedef struct PersonInfo
{
	char name[NAME_MAX];
	int age;
	char gender[GENDER_MAX];
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}Info;
 struct Seqlist;
typedef struct Seqlist Contact;
//使用順序表的前置聲明
//struct SeqList;

//typedef struct SeqList Contact;

//通訊里提供的操作

//通訊錄的初始化和銷毀
void ContactInit(Contact* pcon);//實(shí)際初始化的還是順序表
void ContactDesTroy(Contact* pcon);

//增加、刪除、修改、查找、查看通訊錄
void ContactAdd(Contact* pcon);
void ContactDel(Contact* pcon);
void ContactModify(Contact* pcon);
void ContactFind(Contact* pcon);
void ContactShow(Contact* pcon);

5、經(jīng)典順序表OJ

1.經(jīng)典算法OJ題1:?移除元素(點(diǎn)擊進(jìn)入題目)

思路一:遍歷數(shù)組,當(dāng)數(shù)組中的等于val,就執(zhí)行順序表的刪除操作
思路二:雙指針?lè)?/span>
數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)
我們定義倆個(gè)指針,起始地時(shí)候讓他們指向arr[0]的地方,我們讓j指針遍歷數(shù)組,如果不等于val的值時(shí)就把j中的值賦給i,然后i++,j++;如果等于,我們就讓j++。最后返回i的下標(biāo)。此時(shí)i的下標(biāo)就是數(shù)組的長(zhǎng)度
代碼如下:
int removeElement(int* nums, int numsSize, int val) {
    int i=0,j=0;
    while(j<numsSize)
    {
        if(nums[j]==val)
        {
         j++;
        }
        else{
             nums[i]=nums[j];
            i++;
            j++;
        }
    }
    return i;
}

2.經(jīng)典算法OJ題2:?合并倆個(gè)有序數(shù)組(點(diǎn)擊進(jìn)入題目)

思路一:將num2合并到num1當(dāng)中,在對(duì)合并的新數(shù)組排序即可
思路二:三指針?lè)?/span>
數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)
定義三個(gè)指針,l1,l2,l3。l3指向nums1的頭,l1指向num1的尾部,l2指向nums2的尾部,nums[l2]和nums2[l2]比大小,大的賦值給num1[l1],并將自身和l1加加。若跳出循環(huán)nums2還不為空怎么辦?將nums2中的元素賦給nums[l3]就可以了。(這種方法只適用于已經(jīng)排序好的)。
代碼如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) 
{
    int l1=m-1;
        int l2=n-1;
        int l3=m+n-1;
        while(l1>=0&&l2>=0)
        {
            if(nums1[l1]>nums2[l2])
            {
                nums1[l3]=nums1[l1];
                l3--;
                l1--;
            }
            else
            {
                nums1[l3]=nums2[l2];
                l3--;
                l2--;
            }
        }
        while(l2>=0)
        {
            nums1[l3]=nums2[l2];
            l3--;
            l2--;
        }

}

6. 順序表的問(wèn)題及思考

1. 中間/頭部的插?刪除,時(shí)間復(fù)雜度為O(N)
2. 增容需要申請(qǐng)新空間,拷?數(shù)據(jù),釋放舊空間。會(huì)有不?的消耗。
3. 增容?般是呈2倍的增?,勢(shì)必會(huì)有?定的空間浪費(fèi)。例如當(dāng)前容量為100,滿了以后增容到
200,我們?cè)倮^續(xù)插?了5個(gè)數(shù)據(jù),后?沒(méi)有數(shù)據(jù)插?了,那么就浪費(fèi)了95個(gè)數(shù)據(jù)空間。
思考:如何解決以上問(wèn)題呢?那就是鏈表了,敬請(qǐng)期待~

數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼),數(shù)據(jù)結(jié)構(gòu)與算法,數(shù)據(jù)結(jié)構(gòu)

最后,感謝大家的觀看~~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-853236.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu):線性表————順序表的實(shí)現(xiàn)、項(xiàng)目和OJ題目(手把手教你寫代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包