数据结构与算法分析 学习笔记(2)

表、栈、和队列

对于Node点的定义

 1 #ifdef _List_H
 2 struct Node;
 3 typedef struct Node *PtrToNode;
 4 typedef PtrToNode List;
 5 typedef PtrToNode Position;
 6 List MakeEmpty(List L);
 7 int IsEmpty(List L);
 8 int IsLast(Position P ,List L);
 9 Position Find (ElementType X,List L);
10 void Delete(ElementType X,List L);
11 Position FindPrevious(ElementType X,List L);
12 void Insert(ElementType X,List L,Position p);
13 void DeleteList(List L);
14 Position Header(List L);
15 Position First(List L);
16 Position Advance(Position P);
17 ElementType Retrieve(Position P);
18 #endif
19 
20 struct Node
21 {
22       ElementType Element;
23      Positon         next;
24 };

单链表函数实现:

测试链表是否为空

1 int IsEmpty(List L)
2 {
3      return L->ext==NULL;
4 }

测试链表是不是末尾

1 int IsLast(Position P,list L)
2 {
3       return P->next==NULL;
4 }

查找元素

1 Position Find( ElementType X,List L)
2 {
3         Position p;
4         p=L->next;
5         while (p!=NULL&&p->Element!=X)
6                  p=p->next;
7          return p;
8  
9 }

链表的删除

void Delete (ElementeType X,List L)
{
      Position p,Temp;
      p=FindPrevious(X,L);
      if(!IsLast(p,L))
        {
            Temp=p->next;
            p->next=Temp->next;
            free(Temp);
        }  
}
1 Position FindPrevious(ElementType X,List L)
2 {
3    Position p;
4    p=L;
5    while(p->next!=NULL&&p->next->Element!=X)
6           p=p->next;
7 }

链表的插入

 1 void Insert(ElementType X, List L,Position p)
 2 {
 3      Positon pTemp;
 4      pTemp=malloc(siziof(struct Node));
 5      if(pTemp==NULL)
 6        printf("erro");
 7      pTemp->element=X;
 8      pTemp->next=p->next;
 9      p->next=pTemp;
10 }

完全删除一个表

void DeleteList(List L)
{
    Position p, pTmp;
    p=L->next;
    L->next=NULL;
    while(p!=NULL)
       {
           pTmp=p->next;
           free(p);
          p=pTmp;
        }
}

 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

典型例子

利用数组实现多项式

 1 typedef struct
 2 {
 3           int CoeffArray[MaxDegree+1];
 4           int HighPower;
 5 } * Ploynomial;
 6 
 7 void ZeroPolynomial(Polynomial poly)//初始化为0
 8 {
 9      int i;
10      for(i=0;i<=Maxdegree;i++)
11          poly->CoeffArray[i];
12          poly->highPower=0;
13 }
14 //多项式相加
15 void AddPolynomial(const Polynomial poly1,const Polynomial poly2,Polynomial polySum)
16 {
17       int i;
18      ZeroPolynomial(PolySum);
19       polySum->HighPower=Max( poly1,poly2);
20       for(i=poly->HighPower;i>=0;i--)
21           ploySUm->CoeffArray[i]=poly1->CoeffArray[i]+poly2->CoeffArray[i];
22 }
23 //多项式相乘
24 void MultPolynomial(const Polynomial poly1,const Polynomial poly2,Polynomial polyProd)
25 {
26         int i,j;
27         ZeroPolynomial(polyProd);
28         polyProd->HighPower=poly1->HighPower+poly2->HighPower;
29          if (polyProd->HighPower>Maxdegree)
30              Error("Exceeded array size");
31          for(i=0;i<=poly1->HighPower;i++)
32              for(j=0;j<=poly2->HighPower;j++)
33                  polyProd->CoeffArray[i+j]=poly1->CoeffArray[i]*poly2->CoeffArray[j];
34 }

可以将其改为通过单链表予以实现;链表节点结构

1 typedef struct Node *PtrToNode
2 struct Node
3 {
4        int CoeffArray;
5        int Exponent;
6        PtrToNode Next;
7 };
8 typedef      PtrToNode   Polynomial;

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

栈为一种后进先出表,实现表的方式都可以用来实现栈。

栈的链表实现:

 1 //栈链表实现的声明
 2 #ifndef  _Stack_h
 3  struct Node;
 4  typedef struct Node *PtrToNode;
 5  typedef ptrToNode Stack;
 6  
 7 int IsEmpty(Stack S);
 8 Stack CreateStack(void);
 9 void DisposeStack(Stack S);
10 void MakeEmpty(Stack S);
11 void Push(ElementType X,Stack S);
12 ElementType Top( Stack S);
13 void Pop(Stack S);
14 
15 #endif 
16 
17 struct Node
18 {
19    ElementType Element;
20    ptrToNode Next;
21 }

测试栈是不是空栈;

1 int IsEmpty(Stack S)
2 {
3     return NULL==S->Next;
4 }

创建一个空栈

 1 Stack CreateStack(void)
 2 {
 3     Stack S;
 4     S=malloc(sizeof(Strcut Node));
 5     if(Null==S)
 6         FataError("out of space!!");
 7    S->next=Null;
 8     MakeEmpty(S);
 9     return S;
10 }
11 void MakeEmpty(Stack S)
12 {
13   if (NULL==S)
14       Erro("Must create Stack first!");
15   else
16    whlie(!IsEmpty(S))
17       Pop(S);
18 }

链表栈的PUSH操作

 1 void Push(Stack S,ElementType Element)
 2 {
 3     prtToNode tmp;
 4     tmp=malloc(sizeof (struct Node));
 5     if(tmp==NULL)
 6     FataErro("Out of space !");
 7    else
 8     {    
 9          tmp->Element=X;
10           tmp->next=S->next;
11           S->next=tmp->next;          
12     }
13 }

返回栈顶元素和Pop操作的实现

 1 ElementType Top(Stack S)
 2 {
 3    if (!IsEmpty(S))
 4       return S->next->Element;
 5    else
 6       Erro("Empty Stack");
 7   }
 8 //栈的Pop操作
 9 void Pop(Stack S)
10 {
11    PtrToNode tmp;
12    if (isEmpty(S))
13       Erro("Empty Stack");
14    else
15         {
16             Tmp=S->next;
17              s->next=s->next->next;
18              free(tmp);
19         }
20 }

由数组实现的栈更为流行:

 1 //栈的数组实现
 2 #ifndef _Stack_h
 3 struct StackRecord;
 4 typedef struct StackRecord *Stack;
 5 
 6 int IsEmpty( Stack S);
 7 int IsFull(Stack S);
 8 Stack CreateStack(int MaxElements);
 9 void DisposeStack(Stack S);
10 void MakeEmpty(Stack S);
11 void Push (Stack S,ElememtType X);
12 ElementType Top(Stack S);
13 void Pop(Stack S);
14 ElementType TopAndPop();
15 
16 #endif
17 
18 #define EmptyTOS (-1)
19 #define MinStackSize (5)
20 
21 struct StackRecord
22 {
23     int Capacity;
24     int TopOfStack;
25     ElementType *Array;
26 }
27 
28 
29 //栈的创建 数组实现
30 stack createStack(int MaxElements)
31 {
32     stack S;
33     if(MaxElements<MinStackSize)
34         Error("Stack size is too small");
35     S= malloc(sizeof(struct StackRecord));
36     if(NULL==S)
37         FataError("out of space");
38     S->Array=malloc(sizeof(ElementType)*MaxElements);
39     if(S->Array==NULL)
40             FataErro("out of space !");
41     S->Capacity=MaxElements;
42     MakeEmpty(S);
43     return S;
44 }
45 //释放一个栈
46 void DisposeStack(Stack S)
47 {
48     if(S!=NULL)
49     {
50         free(S->Array);
51         free(S);
52     }
53 }
54 //检测是否是空栈
55 int IsEmpty(Stack S)
56 {
57     return S->TopOfStack==EmptyTOS;
58 }
59 //创建一个空栈
60 void MakeEmpty(Stack S)
61 {
62     S->TopOfStack=EmptyTOS;
63 }
64 //进栈
65 void Push(ElementType X,Stack S)
66 {
67     if(IsFull(S))
68         Erro("Full stack");
69     else
70         S->Array[++TopOfStack]=X;
71 }
72 //返回栈顶元素
73 ElmentType Top(Stack s)
74 {
75     if(!IsEmpty(S))
76         return S->Array[S->TopOfStack];
77     Erro("Empty stack");
78     return 0;
79 }
80 //Pop
81 void Pop(Stack S)
82 {
83     if(IsEmpty(S))
84         Erro("Empty Stack");
85     else
86         S->TopOfStack--;
87 }
88 //TopAndPop
89 ElementType TopAndPop( Stack S)
90 {
91     if(!IsEmpty(S))
92         return S->Array[S->TopOfStack--];
93     Erro("Empty Stack");
94     
95 }

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

栈的典型应用:括号匹配,后缀表达式的应用,中缀到后缀的转换;函数调用

=============================================================================================================================

队列

                   

#ifndef _Queue_h
struct QueueRecord;
typedef struct QueueRecord *Queue;
int IsEmpty(Queue Q    );
int IsFull(Queue Q);
Queue CreateQueue(int MaxElements);
void DisposeQueue(Queue Q);
void MakeEmpty(Queue Q);
void EnQueue(ElementType X,Queue Q);
Element Front(Queue Q);
void DeQueue(Queue Q);
ElementType FrontAndDequeue(Queue Q);
#endif


#define MinQueueSize (5)

struct QueueRecord
{
    int Capacity;
    int Front;
    int Rear;
    ElementType *Array;
};

//判空
int IsEmpty(Queue Q)
{
    return Q->size==0;
}
//构造空队列
void MakeEmpty(Queue Q)
{
    Q->size=0;
    Q->Front=1;
    Q->Rear=0;
}
//入队
static int succ(int Value ,Queue Q)//循环队列
{
    if(++Value==Q->Capacity)
        Value=0;
    return Value;
}
void EnQueue(ElmentType X,Queue Q)
{
    if(IsFull(Q))
        Erro("Full Queue");
    else
        {
            Q->Size++;
            Q->Rear=Succ(Q->Rear,Q);
            Q->Array[Q->Rear]=X;
        }
}

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

原文地址:https://www.cnblogs.com/HuaiNianCiSheng/p/3093011.html