复习 [数据结构] ---- 线性表

  1. /*-------------------------------------
  2.     顺序表插入删除
  3. -------------------------------------*/
  4. #include <stdio.h>
  5. #define MaxLen 50
  6. typedef char ElemType;
  7. typedef struct
  8. {
  9.     ElemType data[MaxLen];
  10.     int Len;
  11. }Sqlist;
  12. void setnull(Sqlist &L)     //置空表
  13.     {   L.Len=0;    }
  14. int length(Sqlist L)    //求长度
  15.     {   return L.Len;   }
  16. ElemType get(Sqlist L,int i)    //取表中第i个元素
  17. {   
  18.     if( i < 0 || i > L.Len-1 )
  19.         printf("位置参数不正确/n");
  20.     else
  21.         return (L.data[i]);
  22. }
  23. int Locate(Sqlist L,ElemType x) //查找表中x元素
  24. {
  25.     int i=0;
  26.     while( i < L.Len && L.data[i] != x)
  27.         i++;
  28.     if( i == L.Len)
  29.         return -1;
  30.     else
  31.         return i;
  32. }
  33. int insnode(Sqlist &L,ElemType x,int i) //插入元素
  34. {
  35.     int j;
  36.     if( i<0 || i>L.Len)
  37.         return 0;
  38.     else
  39.     {
  40.         L.Len++;
  41.         for( j=L.Len-1 ; j>i ; j--)
  42.             L.data[j]=L.data[j-1];
  43.         L.data[j]=x;
  44.         return 1;
  45.     }
  46. }
  47. int delnode(Sqlist &L,int i)    //删除元素
  48. {
  49.     int j;
  50.     if( i<0 || i>L.Len-1)
  51.         return 0;
  52.     else
  53.     {
  54.         for( j=i ; j<L.Len-1 ; j++)
  55.             L.data[j]=L.data[j+1];
  56.         L.Len--;
  57.         return 1;
  58.     }
  59. }
  60. void display(Sqlist L)
  61. {
  62.     int j;
  63.     printf("顺序表:");
  64.     if(L.Len==0)
  65.         printf("空表/n");
  66.     else
  67.     {
  68.         if(L.Len==1)
  69.             printf("%c",L.data[0]);
  70.         else
  71.         {
  72.             for(j=0;j<L.Len-1;j++)
  73.                 printf("%c-> ",L.data[j]);
  74.             printf("%c",L.data[j]);
  75.         }
  76.         printf("/n");
  77.     }
  78. }
  79. void main()
  80. {
  81.     Sqlist S;
  82.     setnull(S);         //初始化存入 ABCD
  83.     insnode(S,'A',0);
  84.     insnode(S,'B',1);
  85.     insnode(S,'C',2);
  86.     insnode(S,'D',3);
  87.     printf("查找元素位置:%d/n",Locate(S,'D'));
  88.     printf("取表中地3个元素:%c/n",get(S,3));
  89.     display(S);
  90.     insnode(S,'E',0);   //插入元素
  91.     display(S);
  92.     delnode(S,0);       //删除元素
  93.     display(S);
  94. }

 

 

 

  1. /*-------------------------------------
  2.     链式表插入删除
  3. -------------------------------------*/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #define ElemType char
  7. typedef struct node //定义单链表节点类型
  8. {
  9.     ElemType data;      //数据域
  10.     struct node *next;  //指针域
  11. }SNode;
  12. void CreateListF(SNode *&L,ElemType a[],int n)  //头插法建表
  13. {
  14.     SNode *s;int i;
  15.     L=(SNode *)malloc(sizeof(SNode));       //创建头节点
  16.     L->next=NULL;
  17.     for( i=0 ; i<n ; i++)
  18.     {
  19.         s=(SNode *)malloc(sizeof(SNode));   //创建新节点
  20.         s->data=a[i];
  21.         s->next=L->next;    //接链
  22.         L->next=s;
  23.     }
  24. }
  25. void CreateListR(SNode *&L,ElemType a[],int n)  //尾插法建表
  26. {
  27.     SNode *s,*r;int i;
  28.     L=(SNode *)malloc(sizeof(SNode));       //创建头节点
  29.     L->next=NULL;
  30.     r=L;                                    //r L同时指向头节点
  31.     for( i=0 ; i<n ; i++)
  32.     {
  33.         s=(SNode *)malloc(sizeof(SNode));   //创建新节点
  34.         s->data=a[i];
  35.         r->next=s;
  36.         r=s;
  37.     }
  38.     r->next=NULL;
  39. }
  40. void setnull(SNode *&p)                 //置空表
  41. {
  42.     p=(SNode *)malloc(sizeof(SNode));   //创建节点
  43.     p->next=NULL;
  44. }
  45. int length(SNode *p)                    //求链表长度
  46. {
  47.     int n=0;
  48.     SNode *q=p->next;
  49.     while(q!=NULL)
  50.     {
  51.         n++;
  52.         q=q->next;  
  53.     }
  54.     return n;
  55. }
  56. SNode *get(SNode *p,int i)
  57. {
  58.     int j=0;
  59.     SNode *q=p->next;
  60.     while( j<i && q!=NULL)
  61.     {
  62.         q=q->next;
  63.         j++;
  64.     }
  65.     if(q!=NULL)
  66.         return q;
  67.     else
  68.     {
  69.         printf("位置参数i不正确/n");
  70.         return NULL;
  71.     }
  72. }
  73. int locate(SNode *p,ElemType x)     //查找数据域为X的节点的位置
  74. {
  75.     int i=0;
  76.     SNode *q=p->next;
  77.     while(q!=NULL && q->data!=x)
  78.     {
  79.         q=q->next;
  80.         i++;
  81.     }
  82.     if(q==NULL)
  83.         return -1;
  84.     else
  85.         return i;
  86. }
  87. int insnode(SNode *p,ElemType x,int i)
  88. {
  89.     SNode *s,*q;
  90.     s=(SNode *)malloc(sizeof(SNode));   //建立要插入的节点S
  91.     s->data=x;
  92.     if(i==0)                            //*s作为首元素的节点
  93.     {
  94.         s->next=p->next;                //将*s插入到*p之后
  95.         p->next=s;
  96.     }
  97.     else
  98.     {
  99.         q=get(p,i-1);                   //查找第i-1个节点*q
  100.         if(q==NULL)                     //位置参数不正确
  101.             return 0;                   //返回出错信息
  102.         else
  103.         {
  104.             s->next=q->next;            //将*s插入到*q之后
  105.             q->next=s;                  //断链
  106.         }
  107.     }
  108.     return 1;                           //返回成功信息
  109. }
  110. int delnode(SNode *p,int i)
  111. {
  112.     SNode *q,*t;
  113.     if(i==0)                            //*s作为首元素的节点
  114.     {
  115.         t=p->next;
  116.         p->next=t->next;
  117.         free(t);
  118.     }
  119.     else
  120.     {
  121.         q=get(p,i-1);                   //查找第i-1个节点*q
  122.         if(q==NULL)                     //位置参数不正确
  123.             return 0;                   //返回出错信息
  124.         else
  125.         {
  126.             t=q->next;                  //t指向*q之后的节点既被删节点
  127.             q->next=t->next;            //从链表中删除*t
  128.             free(t);                    //释放t所指内存空间
  129.         }
  130.     }
  131.     return 1;                           //返回成功信息
  132. }
  133. void display(SNode *p)      //显示链表内容
  134. {
  135.     int n=length(p),i;      //n为链表长度
  136.     SNode *q=p->next;       //q指向首节点
  137.     printf("单链表显示:");
  138.     if(n==0)
  139.         printf("空表");
  140.     else if(n==1)           //只有一个元素
  141.             printf("%c",q->data);
  142.         else
  143.         {
  144.             for(i=1;i<n;i++)
  145.             {
  146.                 printf("%c-> ",q->data);
  147.                 q=q->next;
  148.             }
  149.             printf("%c",q->data);
  150.         }
  151.     printf("/n");
  152. }
  153. void main()
  154. {
  155.     char array[4]={'A','B','C','D'};
  156.     SNode *S;
  157.     CreateListF(S,array,4);                 //建立链表
  158.     printf("链表长度为:%d/n",length(S)); //显示链表长度
  159.     display(S);
  160.     insnode(S,'E',0);       //插入操作
  161.     display(S);
  162.     delnode(S,0);           //删除操作
  163.     display(S);
  164. }

 

 

  1. /*-------------------------------------
  2.     双链表插入删除
  3. -------------------------------------*/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #define ElemType char
  7. typedef struct node
  8. {
  9.     ElemType data;      //数据域
  10.     struct node *prior; //指向前驱节点的指针
  11.     struct node *next;  //指向直接后续节点的指针
  12. }DNode;
  13. void setnull(DNode *&p)                 //p为引用型指针
  14. {
  15.     p=(DNode *)malloc(sizeof(DNode));   //创建节点
  16.     p->next=p->prior=NULL;
  17. }
  18. int length(DNode *p)    //计算双链表长度
  19. {
  20.     int n=0;
  21.     DNode *q=p->next;
  22.     while(q!=NULL)
  23.     {
  24.         n++;
  25.         q=q->next;
  26.     }
  27.     return n;
  28. }
  29. DNode *get(DNode *p,int i)//取双链表第i个节点的地址
  30. {
  31.     int j=0;
  32.     DNode *q=p->next;
  33.     while( j<i && q!=NULL)
  34.     {
  35.         q=q->next;
  36.         j++;
  37.     }
  38.     if(q!=NULL)
  39.         return q;
  40.     else
  41.     {
  42.         printf("位置参数i不正确/n");
  43.         return NULL;
  44.     }
  45. }
  46. int locate (DNode *p,ElemType x)//按值查找
  47. {
  48.     int i=0;
  49.     DNode *q=p->next;
  50.     while( q!=NULL && q->data!=x)   //查找data域为x的第一个节点
  51.     {
  52.         q=q->next;
  53.         i++;
  54.     }
  55.     if(q==NULL)                     //未找到
  56.         return -1;
  57.     else
  58.         return i;                   //找到
  59. }
  60. int insnode(DNode *p,ElemType x,int i)  //在第i个位置插入新的元素
  61. {
  62.     DNode *s,*q;
  63.     s=(DNode *)malloc(sizeof(DNode));   //建立要插入的节点S
  64.     s->data=x;
  65.     if(i==0)                            //*s作为首元素的节点
  66.     {
  67.         s->next=p->next;                //将*s插入到*p之后
  68.         if(p->next!=NULL)
  69.             p->next->prior=s;
  70.         s->prior=p;
  71.         p->next=s;
  72.     }
  73.     else
  74.     {
  75.         q=get(p,i-1);                   //查找第i-1个节点*q
  76.         if(q==NULL)                     //位置参数不正确
  77.             return 0;                   //返回出错信息
  78.         else
  79.         {
  80.             s->next=q->next;            //将*s插入到*q之后
  81.             if(q->next!=NULL)
  82.                 q->next->prior=s;
  83.             s->prior=q;
  84.             q->next=s;                  //断链
  85.         }
  86.     }
  87.     return 1;                           //返回成功信息
  88. }
  89. int delnode(DNode *p,int i)             //删除节点
  90. {
  91.     DNode *q,*s;
  92.     if(i==0)                            //删除首元素的节点
  93.     {
  94.         s=p->next;
  95.         p->next=s->next;
  96.         if(s->next!=NULL)
  97.             s->next->prior=p;
  98.         free(s);
  99.     }
  100.     else
  101.     {
  102.         q=get(p,i-1);                   //查找第i-1个节点*q
  103.         if(q==NULL)                     //位置参数不正确
  104.             return 0;                   //返回出错信息
  105.         else
  106.         {
  107.             s=q->next;                  //s指向*q之后的节点既被删节点
  108.             q->next=s->next;            //从链表中删除*s
  109.             if(s->next!=NULL)
  110.                 s->next->prior=q;
  111.             free(s);                    //释放s所指内存空间
  112.         }
  113.     }
  114.     return 1;                           //返回成功信息
  115. }
  116. void display(DNode *p)      //显示链表内容
  117. {
  118.     int n=length(p),i;
  119.     DNode *q=p->next;
  120.     printf("双链表显示:");
  121.     if(n==0)
  122.         printf("空表");
  123.     else if(n==1)           //只有一个元素
  124.             printf("%c",q->data);
  125.         else
  126.         {
  127.             for(i=1;i<n;i++)
  128.             {
  129.                 printf("%c-> ",q->data);
  130.                 q=q->next;
  131.             }
  132.             printf("%c",q->data);
  133.         }
  134.     printf("/n");
  135. }
  136. void main()
  137. {
  138.     DNode *L;
  139.     setnull(L);
  140.     insnode(L,'A',0);
  141.     insnode(L,'B',1);
  142.     insnode(L,'C',2);
  143.     insnode(L,'D',3);
  144.     display(L);
  145.     delnode(L,3);
  146.     display(L);
  147. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值