zoukankan      html  css  js  c++  java
  • 带头结点的链表实现线性表的基本操作

    带头结点的链表和不带头结点的链表之间存在一定的区别

    1.phead是从第一个开始循环(第一个数据元素), 带头结点的phead从第二个结点开始循环(第一个数据元素)

    2.不带头结点的链表在插入和删除操作的时候需要把插入的第一个位置和其他位置分开讨论,带头结点的链表在插入和删除的时候操作一致

    主要原因是不带头结点的链表phead和phead->next赋值的时候不一致的情况造成的。

    所以带头结点的链表比不带头结点的链表方便

    所有的操作都是针对元素本身,所以需要找到或者给出元素所在的位置i,才能对其进行操作,插入和删除找到的是i-1

    若是对整个结构操作,则需要利用循环,同样利用到位置i或者指针p对数据元素的操作。

      1 //线性表链式存储
      2 
      3 //链表结点
      4 struct LNode
      5 {
      6     elemtype data;
      7     struct LNode *next;
      8 };
      9 
     10 //1.初始化带有头结点的链表
     11 int InitList_L(LNode *pHead)
     12 {
     13     pHead = (LNode*)malloc(sizeof(LNode));
     14     if (!pHead)
     15     {
     16         return ERROR;
     17     }
     18     pHead->next = NULL;
     19     return OK;
     20 }
     21 
     22 //2.建立链表的方式之一,通过循环调用插入链表结点函数
     23 
     24 int CreatList_L(LNode *pHead)
     25 {
     26     
     27     if (!pHead)
     28     {
     29         return ERROR;
     30     }
     31     
     32      
     33     for (int i = 3;i > 0;--i)
     34     {
     35         LNode *p = (LNode*)malloc(sizeof(LNode));
     36         scanf("%d",&(p->data));
     37         p->next = pHead->next;
     38         pHead->next = p;
     39     }
     40     return OK;
     41 }
     42 
     43 //3.插入结点
     44 int ListInsert_L(LNode *pHead,int i,elemtype e)
     45 {
     46     LNode *p = pHead;
     47     int j = 0;
     48     while (p && j < i-1)
     49     {
     50         p = p->next;
     51         j++;
     52     }
     53     LNode *s = (LNode *)malloc(sizeof(LNode));
     54     s->data = e;
     55     s->next = p->next;
     56     p->next = s;
     57     return OK;
     58 }
     59 int CreatList_L2(LNode *pHead)
     60 {
     61 
     62     LNode *p = pHead ;
     63     int e = 0;
     64     for (int i = 2;i > 0;--i)
     65     {
     66         scanf("%d",&e);
     67         ListInsert_L(p,1,e);
     68         p = p->next;
     69     }
     70     return OK;
     71 }
     72 
     73 
     74 
     75 //4.删除链表结点
     76 int DeleteList_L(LNode *pHead,int i)
     77 {
     78     LNode *p = pHead;
     79     int j = 0;
     80     while (p && j < i-1)
     81     {
     82         p = p->next;
     83         ++j;
     84     }
     85     LNode *q = p->next;
     86     p->next = q->next;
     87     free(q);
     88     return OK;
     89 }
     90 //5.清空或者摧毁链表(包括头结点)
     91 //直接清除所有节点
     92 int ClearList(LNode *pHead)
     93 {
     94     LNode *pTemp= NULL;
     95     while(pHead)
     96     {
     97         pTemp = pHead ->next;
     98         free(pHead);
     99         pHead = pTemp;
    100     }
    101     return  OK;
    102 }
    103 //间接清空所有结点
    104 int ClearList_L(LNode *pHead)
    105 {
    106     //删除数据元素结点
    107     while (pHead->next)
    108     {
    109         DeleteList_L(pHead,1);
    110     }
    111     free(pHead);//最后删除头结点
    112     return OK;
    113 }
    114 
    115 //6.取得线性表的第i个数据元素
    116 int GetList_L(LNode *pHead,int i)
    117 {
    118     int j = 1;
    119     LNode *p = pHead->next;
    120     while(p && j < i)
    121     {
    122         p->next;
    123     }
    124     //return p;//返回位置指针
    125     return p->data;//返回数据元素
    126     
    127 }
    128 //7.后继
    129 
    130 int NextElem_L(LNode *pHead,int i)
    131 {
    132     int j = 1;
    133     LNode *p = pHead->next;
    134     while(p && j < i)
    135     {
    136         p->next;
    137     }
    138     
    139     return p->next->data;//返回后继指针
    140 }
    141 
    142 //8.前驱
    143 int PriorElem_L(LNode *pHead,int i)
    144 {
    145     int j = 0;
    146     LNode *p = pHead;
    147     while(p && j < i -1)
    148     {
    149         p->next;
    150     }
    151 
    152     return p->next->data;//返回后继指针
    153 }
    154 
    155 //9.长度
    156 int ListLength(LNode *pHead)
    157 {
    158     int length = 0;
    159     for (LNode * p = pHead->next;p != NULL;)
    160     {
    161         length++;
    162         p=p->next;
    163     }
    164     return length;
    165 }
    166 //10.输出
    167 void ListDisplay(LNode *pHead)
    168 {
    169     
    170     for (LNode * p = pHead->next;p != NULL;)
    171     {
    172         printf("%d ",p->data);
    173         p=p->next;
    174     }
    175     
    176 }
    177 
    178 int main()
    179 {
    180     LNode *pHead =NULL;
    181     //InitList_L(pHead);
    182     pHead = (LNode*)malloc(sizeof(LNode));
    183     pHead->next = NULL;
    184     if (!pHead)
    185     {
    186         return ERROR;
    187     }
    188     CreatList_L(pHead);
    189     ListDisplay(pHead);
    190     ListInsert_L(pHead,2,190);
    191     printf("
    ");
    192     ListDisplay(pHead);
    193     printf("
    ");
    194     DeleteList_L(pHead,3);
    195 ListDisplay(pHead);
    196     return OK;
    197 }
    View Code
  • 相关阅读:
    mysql学习笔记——建表需满足的三大范式
    mysql学习笔记——对数据记录查询操作的补充(单表内查询)
    mysql学习笔记——对数据表中记录的操作
    转载----- mysql 五大约束
    mysql笔记------对数据表操作
    c语言中static的用法
    解决Android抽屉被击穿问题
    解决ScrollView与ListView事件冲突
    使用Loader实时查询本地数据库用法
    Android中实现两次点击返回键退出本程序
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3149096.html
Copyright © 2011-2022 走看看