今天下午去一家公司去面试,他们面试题中设计出了我从没涉及的C语言链表的问题,我想了很久脑子有了概念,却没有计算机、
没有办法进行实践操作,无奈写了一黑板的辅助图,最终还是放弃了。原因是:这是一家中介公司,说是如果觉得我们能力够直接推荐的,不行就要进行培训,说是100%就业。无论题目做的再好还是需要你付出一定的,前两个同学已经摇头走了、我对这个题目感兴趣于是我拍下了这张照片也走了。
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
//定义链表中的节点
typedef struct NODE
{
int member;
//节点中的成员
struct NODE *pNext;
//指向下一个节点的指针
}_NODE,*pNODE;
void Intel(struct NODE *Pointer);
int main()
{
//定义12个节点组成一个链表
struct NODE A,B,C,D,E,F,G,H,I,J,K,L;
//为每一个节点设定逻辑关系 说明每一个链表下一个是谁
A.pNext = &B;B.pNext = &C;C.pNext = &D;
D.pNext = &E;E.pNext = &F;F.pNext = &G;
G.pNext = &H;H.pNext = &I;I.pNext = &J;
J.pNext = &K;K.pNext = &L;L.pNext = NULL;
struct NODE *pHead = &A;
//设定头指针 声明链表的头是谁
struct NODE *pPointer;
//设定数据结构操作指针
int i =0;
for(pPointer =pHead;pPointer != NULL;pPointer = pPointer->pNext)
//第一次用for这样处理链表结构 节点下一个如果NULL则跳出循环 如果非NULL,则把这个下一个节点赋予给操作指针进行操作
{
pPointer->member = i;
i += 1;
}
i =0;
//输出
for(pPointer = pHead;pPointer != NULL;pPointer = pPointer->pNext)
{
printf("Node %c = %d\n",'A' +i,pPointer->member);
i += 1;
}
i = 0;
printf("链表倒序处理\n");
Intel(&A);
//处理后需要重新定义头指针
pHead = &L;
//设定头指针 链表的尾巴做头
//输出
for(pPointer = pHead;pPointer != NULL;pPointer = pPointer->pNext)
{
printf("Node %c = %d\n",'L' -i,pPointer->member);
i += 1;
}
i = 0;
Sleep(1000000);
return 0;
}
void Intel(struct NODE *pNode)
{
struct NODE *pPointer;//设定操作性指针
struct NODE *pPrev = NULL;//上一个
struct NODE *pNex;//下一个
for(pPointer = pNode;pPointer != NULL;pPointer = pNex)
{
pNex = pPointer->pNext;//把指针的下个节点记录下来
pPointer->pNext = pPrev;//把上一个节点接到这个节点pNext上
pPrev = pPointer;//把这个节点记录下来 等操作性指针移动到下一个指针式时 进行反上pNext赋值用
}
}
上面红色部分就是这个第一题的源码
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
链表的可以操作性就是那个指向自己的pNext结构体指针
struct Node
{
int member;
struct Node *pNext;
};
链表只能往下走,因为它只有pNext进行操作,最后节点是指向NULL (即:0)
也就是
把ABC三个节点连接起来就成为了链表,他们之间的连接就是那个pNext;
Node A,B,C;
A节点的pNext指向B
B节点的pNext指向C
B节点的pNext指向NULL 这样一个有模有样的链表结构就有了
之前有定义过 #define NULL 0 //NULL表示为空
A->B->C->NULL
问题:那么链表定义好后,怎么用仅有的pNext进行操作,使链表倒序呢?
成为这样:
C->B->A->NULL
我想了很久,只有一个思路,就是一个个从头拿下来,再接上他们
就是这样一个步骤
A->B->C->NULL
源码是:pPointer = pPointer->pNext;
当操作性指针到A时 把A节点的pNext 直接接到NULL(pPointer是指向A的,那么下一个不是NULL吗?操作指针的pNext如何移动到B呢?
A->NULL B->C->NULL 不慌!每次循环体开始pNex记录下一个节点B)
当操作性指针到B时 把B节点的pNext 接到A节点上(如何指向上一个节点呢?不慌!每次循环体结束pPrev记录上一个节点A)
B->A->NULL C->NULL
当操作性指针到C时 把C节点的pNext 接到B节点上 (同上)
C->B->A->NULL
这样就大功告成