离找工作日近,现将每日复习内容贴于此,以便复习使用。
单链表C语言实现
正确在笔试面试时用笔实现单链表,首先重要的是明确链表结构的定义。因此下面定义非常重要:
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;
完整定义如下:
List.h
#ifndef _List_H_
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;
int initList(List L);
int IsEmpty(List L);
int IsLast(Position P, List L);
Position Find(ElementType x, List L);
Position Delete(ElementType x, List L);
Position FindPrevious(ElementType x, List L);
void Inser(ElementType x, List L, Position P);
void DeleteList(List L);
List Reverse(List L);
#endif
struct Node
{
ElementType Element;
Position Next;
};
在实现单链表的功能时,init时需要分配空间,不知为什么,我经常会忘记malloc...最后一个链表反转也会经常考察,需要不断练习。
List.cint
initList(List L)
{
L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
}
int
IsEmpty(List L)
{
return L-Next == NULL;
}
int
IsLast(Position P, List L)
{
return P->Next == NULL;
}
Position
Find(ElementType x, List L)
{
Position P;
P = L->Next;
while(P != NULL && P->Element != X)
P = P->Next;
return P;
}
void
Delete(ElementType x, List L)
{
Position P, TmpCell;
P = FindPrevious(X, L);
if(!IsLast(P, L))
{
TmpCell = P->Next;
P->Next = Tmp->Nect;
free(TmpCell);
}
}
Position
FindPrevious(ElementType x, List L)
{
Position P;
P = L;
while(P->Next != NULL && P->Next->Element != x)
P = P->Next;
return P;
}
void Insert(ElementType x, List L, Position P)
{
Position TmpCell;
TmpCell = (Position)malloc(sizeof(struct Node));
if(TmpCell == NULL)
{
exit(-1);
}
TmpCell->Element = x;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}
void
DeleteList(List L)
{
Position P, Tmp;
P = L->Next;
L->Next = NULL;
while(P != NULL)
{
Tmp = P->Next;
free(P);
P = Tmp;
}
}
List
Reverse(List L)
{
Position prev = NULL;
Position cur = NULL;
Position next = L;
for(;next != NULL;)
{
cur = next;
next = cur->Next;
cur->Next = prev;
prev = cur;
}
return prev;
}