データ構造学習ノート---リニアテーブル(チェーンに関する一般的なアルゴリズムと面接問題)
1.引用
この文章は主にチェーンの計算方法と面接問題について説明します.
2. シングルチェーン表の逆順(率先して接合しない)
この文章は主にチェーンの計算方法と面接問題について説明します.
2. シングルチェーン表の逆順(率先して接合しない)
/* */
#include "ds.h"
using namespace std;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
void InitList(LinkList &L);
void TailCreList(LinkList &L, int n);
void ReverseList(LinkList &L);
void TraverseList(LinkList L);
void InitList(LinkList &L)
{
L = NULL;
}
void TailCreList(LinkList &L, int n)
{
LinkList p, tail, s;
int i;
if (0 > n)
return;
tail = L;
printf("please input %d number:", n);
for (i = 1; i <= n; i++)
{
s = (LinkList)malloc(sizeof(LNode));
scanf("%d", &(s->data));
if (1 == i)
{
s->next = tail;
L = tail = s;
}
else
{
tail->next = s;
tail = tail->next;
}
}
tail->next = NULL;
}
void ReverseList(LinkList &L)
{
LinkList pre_pre, pre, cur;
//
if (NULL == L || NULL == L->next)
return;
cur = L;
pre = NULL;
// ,
while (cur->next)
{
// pre_pre, pre, cur
pre_pre = pre;
pre = cur;
cur = cur->next;
//
pre->next = pre_pre;
}
//
cur->next = pre;
// L
L = cur;
}
void TraverseList(LinkList L)
{
LinkList p = L;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("
");
}
int main()
{
LinkList L;
InitList(L);
TailCreList(L, 5);
TraverseList(L);
ReverseList(L);
TraverseList(L);
}
3. 一方向チェーンを入力して、このチェーンの最後からk番目のノードを出力します.// , k 。
#include "ds.h"
using namespace std;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
void InitList(LinkList &L);
void TailCreList(LinkList &L, int n);
int OutputLast_K(LinkList L, int k);
void TraverseList(LinkList L);
void InitList(LinkList &L)
{
L = NULL;
}
void TailCreList(LinkList &L, int n)
{
LinkList p, tail, s;
int i;
if (0 > n)
return;
tail = L;
printf("please input %d number:", n);
for (i = 1; i <= n; i++)
{
s = (LinkList)malloc(sizeof(LNode));
scanf("%d", &(s->data));
if (1 == i)
{
s->next = tail;
L = tail = s;
}
else
{
tail->next = s;
tail = tail->next;
}
}
tail->next = NULL;
}
/*
:
0 ->
-1 -> k<1
-2 -> k
*/
int OutputLast_K(LinkList L, int k)
{
LinkList p_k = L, p_add_k = L;
int i = 0;
// k<1
if (NULL == L || k < 1)
{
if (k < 1)
printf("k < 1
");
return -1;
}
// p_add_k ,p_k k
while (p_add_k)
{
if (i < k)
{
i++;
}
else
{
p_k = p_k->next;
}
p_add_k = p_add_k->next;
}
// K
if (i == k)
{
while (p_k)
{
printf("%d ", p_k->data);
p_k = p_k->next;
}
printf("
");
}
// K
else
{
printf("List L less %d element.
", k);
return -2;
}
return 0;
}
void TraverseList(LinkList L)
{
LinkList p = L;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("
");
}
int main()
{
LinkList L;
InitList(L);
TailCreList(L, 5);
TraverseList(L);
for (int i = 0; i < 8; i++ )
OutputLast_K(L, i);
}