【2019年單鏈表】
41.(13分)設(shè)線性表
L
=
(
a
1
,
a
2
,
a
3
,
…
,
a
n
?
2
,
a
n
?
1
,
a
n
)
L=(a_1,a_2 ,a_3,…,a_{n-2},a_{n-1},a_n)
L=(a1?,a2?,a3?,…,an?2?,an?1?,an?)采用帶頭結(jié)點(diǎn)的單鏈表保存,鏈表中的結(jié)點(diǎn)定義如下:
typedef struct node {int data;
struct node* next;
}NODE;
請(qǐng)?jiān)O(shè)計(jì)一個(gè)空間復(fù)雜度為O(1)且時(shí)間上盡可能高效的算法,重新排列L中的各結(jié)點(diǎn),得到線性表
L
=
(
a
1
,
a
n
,
a
3
,
a
n
?
1
,
a
3
,
a
n
?
2
,
…
)
L=(a_1,a_n ,a_3,a_{n-1},a_3,a_{n-2},…)
L=(a1?,an?,a3?,an?1?,a3?,an?2?,…)。要求:
(1)給出算法的基本設(shè)計(jì)思想。
(2)根據(jù)設(shè)計(jì)思想,采用C或C++語(yǔ)言描述算法,關(guān)鍵之處給出注釋。
(3)說明你所設(shè)計(jì)的算法的時(shí)間復(fù)雜度。
本節(jié)分為五小節(jié)講解。
第一小節(jié)是針對(duì)頭插法新建鏈表進(jìn)行實(shí)戰(zhàn)
第二小節(jié)是針對(duì)尾插法新建鏈表進(jìn)行實(shí)戰(zhàn)
第三小節(jié)是鏈表按位置查找及按值查找實(shí)戰(zhàn)
第四小節(jié)是往第i個(gè)位置插入元素實(shí)戰(zhàn)
第五小節(jié)是鏈表的調(diào)試方法解析
上一講介紹了鏈表的新增、刪除、查找的原理。
畫流程圖很關(guān)鍵。
使用頭插法來新建鏈表:
#include#includetypedef int ElemType; //寫分號(hào)
typedef struct LNode
{ElemType data; //數(shù)據(jù)域
struct LNode* next;
}LNode,*LinkList;
//輸入3,4,5,6,7,9999
void list_head_insert(LNode*& L)//LNode*是結(jié)構(gòu)體指針 等價(jià)于 LinkList(常用)
{//申請(qǐng)頭結(jié)點(diǎn)空間,頭指針指向頭結(jié)點(diǎn)
L = (LinkList)malloc(sizeof(LNode));//不能寫LinkList和LNode* - 結(jié)構(gòu)體指針 - 大小8個(gè)字節(jié)
L->next = NULL;//頭結(jié)點(diǎn)的next為NULL - 第一次讀取時(shí)s->next = L->next =NULL
//第一個(gè)結(jié)點(diǎn)
ElemType x;//第一個(gè)結(jié)點(diǎn)的數(shù)據(jù)
scanf("%d", &x);
LNode *s;//指針s指向第一個(gè)結(jié)點(diǎn)
//s = (LinkList)malloc(sizeof(LNode));
//s->data = x;//x存放到數(shù)據(jù)域中
//s->next = NULL;//第一個(gè)結(jié)點(diǎn)最后會(huì)成為最后一個(gè)結(jié)點(diǎn) - next指針應(yīng)該為NULL
//L->next = s;//頭結(jié)點(diǎn)的next,就指向了第一個(gè)結(jié)點(diǎn)
while (x != 9999)//輸入9999代表輸入結(jié)束 - 不想把9999存入鏈表
{//scanf("%d", &x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
//頭插法,把插入的元素插到第一個(gè)位置
s->next = L->next;//s的next指向原本鏈表的第一個(gè)結(jié)點(diǎn)
L->next = s;//頭結(jié)點(diǎn)的next指向新結(jié)點(diǎn)
scanf("%d", &x);//讀取放在最后,讀到結(jié)束的9999時(shí)就不會(huì)存入鏈表
}
}
void print_list(LinkList L)
{L = L->next;
while (L != NULL)
{printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
//頭插法新建鏈表
int main()
{LinkList L; //L是鏈表頭指針,是結(jié)構(gòu)體指針類型 - 大小8個(gè)字節(jié)
list_head_insert(L); //輸入數(shù)據(jù)可以為3 4 5 6 7 9999,頭插法新建鏈表
print_list(L); //鏈表打印
return 0;
}
#include#includetypedef int ElemType; //寫分號(hào)
typedef struct LNode
{ElemType data; //數(shù)據(jù)域
struct LNode* next;
}LNode, * LinkList;
void list_tail_insert(LNode*& L)
{L = (LinkList)malloc(sizeof(LNode));//申請(qǐng)頭結(jié)點(diǎn)空間,頭指針指向頭結(jié)點(diǎn)
L->next = NULL;//頭結(jié)點(diǎn)的next為NULL
ElemType x;
scanf("%d", &x);
LNode* s, * r = L;//s用來指向申請(qǐng)的新節(jié)點(diǎn),r始終指向列表尾部
while (x != 9999)
{s = (LinkList)malloc(sizeof(LNode));//為新節(jié)點(diǎn)申請(qǐng)空間
s->data = x;
r->next = s;//新節(jié)點(diǎn)給尾節(jié)點(diǎn)的next指針
r = s;//r要指向新的尾部
scanf("%d", &x);
}
r->next = NULL;//讓尾節(jié)點(diǎn)的next為NULL
}
void print_list(LinkList L)
{L = L->next;
while (L != NULL)
{printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
//尾插法新建鏈表
int main()
{LinkList L; //L是鏈表頭指針,是結(jié)構(gòu)體指針類型 - 大小8個(gè)字節(jié)
list_tail_insert(L);
print_list(L); //鏈表打印
return 0;
}
#include#includetypedef int ElemType; //寫分號(hào)
typedef struct LNode
{ElemType data; //數(shù)據(jù)域
struct LNode* next;
}LNode, * LinkList;
void list_tail_insert(LNode*& L)
{L = (LinkList)malloc(sizeof(LNode));//申請(qǐng)頭結(jié)點(diǎn)空間,頭指針指向頭結(jié)點(diǎn)
L->next = NULL;//頭結(jié)點(diǎn)的next為NULL
ElemType x;
scanf("%d", &x);
LNode* s, * r = L;//s用來指向申請(qǐng)的新節(jié)點(diǎn),r始終指向列表尾部
while (x != 9999)
{s = (LinkList)malloc(sizeof(LNode));//為新節(jié)點(diǎn)申請(qǐng)空間
s->data = x;
r->next = s;//新節(jié)點(diǎn)給尾節(jié)點(diǎn)的next指針
r = s;//r要指向新的尾部
scanf("%d", &x);
}
r->next = NULL;//讓尾節(jié)點(diǎn)的next為NULL
}
void print_list(LinkList L)
{L = L->next;
while (L != NULL)
{printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
//按位置查找
LinkList GetElem(LinkList L, int SearchPos)
{int j = 0;
while (L && j< SearchPos)//L!=NULL,地址不為NULL
{L = L->next;
j++;
}
return L;
}
//按值查找
LinkList LocateElem(LinkList L, ElemType SearchVal)
{while (L)
{if (L->data == SearchVal)//如果找到對(duì)應(yīng)的值,返回那個(gè)節(jié)點(diǎn)的地址
{ return L;
}
L = L->next;
}
return NULL;
}
//尾插法新建鏈表
int main()
{LinkList L; //L是鏈表頭指針,是結(jié)構(gòu)體指針類型 - 大小8個(gè)字節(jié)
list_tail_insert(L);
print_list(L); //鏈表打印
LinkList search;//用來存儲(chǔ)拿到的某一個(gè)節(jié)點(diǎn)
//按位置查找
search = GetElem(L, 2);
if (search != NULL)
{printf("Secceeded in searching by serial number\n");
printf("%d\n", search->data);
}
//按值查找
search = LocateElem(L, 6);
if (search != NULL)
{printf("Secceeded in searching by serial number\n");
printf("%d\n", search->data);
}
return 0;
}
#include#includetypedef int ElemType; //寫分號(hào)
typedef struct LNode
{ElemType data; //數(shù)據(jù)域
struct LNode* next;
}LNode, * LinkList;
void list_tail_insert(LNode*& L)
{L = (LinkList)malloc(sizeof(LNode));//申請(qǐng)頭結(jié)點(diǎn)空間,頭指針指向頭結(jié)點(diǎn)
L->next = NULL;//頭結(jié)點(diǎn)的next為NULL
ElemType x;
scanf("%d", &x);
LNode* s, * r = L;//s用來指向申請(qǐng)的新節(jié)點(diǎn),r始終指向列表尾部
while (x != 9999)
{s = (LinkList)malloc(sizeof(LNode));//為新節(jié)點(diǎn)申請(qǐng)空間
s->data = x;
r->next = s;//新節(jié)點(diǎn)給尾節(jié)點(diǎn)的next指針
r = s;//r要指向新的尾部
scanf("%d", &x);
}
r->next = NULL;//讓尾節(jié)點(diǎn)的next為NULL
}
void print_list(LinkList L)
{L = L->next;
while (L != NULL)
{printf("%3d", L->data);
L = L->next;
}
printf("\n");
}
//按位置查找
LinkList GetElem(LinkList L, int SearchPos)
{int j = 0;
if (SearchPos< 0)
{return NULL;
}
while (L && j< SearchPos)//L!=NULL,地址不為NULL
{L = L->next;
j++;
}
return L;
}
//按值查找
LinkList LocateElem(LinkList L, ElemType SearchVal)
{while (L)
{if (L->data == SearchVal)//如果找到對(duì)應(yīng)的值,返回那個(gè)節(jié)點(diǎn)的地址
{ return L;
}
L = L->next;
}
return NULL;
}
//i代表插入到第幾個(gè)位置
bool ListFrontInsert(LinkList L, int i, ElemType InsertVal)
{LinkList p = GetElem(L, i - 1);
if (NULL == p)
{return false;
}
LinkList q;
q = (LinkList)malloc(sizeof(LNode));//為新節(jié)點(diǎn)申請(qǐng)空間
q->data = InsertVal;
q->next = p->next;
p->next = q;
return true;
}
//尾插法新建鏈表
int main()
{LinkList L; //L是鏈表頭指針,是結(jié)構(gòu)體指針類型 - 大小8個(gè)字節(jié)
list_tail_insert(L);
print_list(L); //鏈表打印
LinkList search;//用來存儲(chǔ)拿到的某一個(gè)節(jié)點(diǎn)
bool ret;
ret = ListFrontInsert(L, 2, 99);//新節(jié)點(diǎn)插入第i個(gè)位置
print_list(L);
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)查看詳情吧