zoukankan      html  css  js  c++  java
  • 单链表创建,删除节点,获取元素(与线性表比较)

     1 //用c语言描述单链表 
     2 
     3 //缺点,比起线性表,找出第i个元素很困难,时间复杂度为o(n),线性表只要直接下标获取,时间复杂度为O(1)
     4 //优点,单链表的插入和删除时非常方便的,时间复杂度为o(1),线性表的插入和删除最后情况是删除和插入第一个元素,时间复杂度为o(n) 
     5 
     6 
     7 #include <stdio.h>
     8 typedef int ElemType;
     9 typedef int Status;
    10 
    11 //1.单链表的初始化 
    12 
    13 typedef struct Node  //定义一个节点 
    14 {
    15     ElemType data ;  //用来存储数据,数据域
    16     struct Node *next ;//用来存放下一个节点的地址,指针域      
    17 } Node;
    18 typedef struct Node * LinkList;  //取别名,遇到LinkList相当于遇到Node 
    19 
    20 
    21 //******************************************************************************* 
    22 
    23 //2.找出第i个元素
    24 
    25 Status GetElement(LinkList L,int i,ElemType *e)  
    26 {
    27     int j=1;   //记录当前位置 
    28     LinkList p;
    29     p=L->next;   //p指向单链表的第一个指针,必须为l->next,因为头节点没数据 
    30     while(p && j<i)                                 //最坏情况是i=n,所以时间复杂度为o(n) 
    31     {
    32         p=p->next;   //把下一个节点的地址复制给p 
    33         ++j;        //当前位置加1 
    34      } 
    35      
    36     if(!p || j>i)   //若p为空或者j大于单链表的长度退出程序 
    37        return -1; 
    38 
    39     *e=p->data; 
    40     return *e;
    41 } 
    42 
    43 //******************************************************************************* 
    44 
    45 //3.单链表的插入
    46 
    47 Status ListInsert(LinkList *L,int i,ElemType e) 
    48 {
    49     int j=1;   //记录当前位置 
    50     LinkList p,s;
    51     p=*L;   //p指向当前的地址,当头节点为空也能插入, 
    52     while(p && j<i)                                 //最坏情况是i=n,所以时间复杂度为o(n) 
    53     {
    54         p=p->next;   //把下一个节点的地址复制给p 
    55         ++j;        //当前位置加1 
    56      } 
    57        
    58     if(!p || j>i)   //若p为空或者j大于单链表的长度退出程序 
    59        return -1; 
    60        
    61     s=(LinkList) malloc(sizeof (Node));  //因为插入一个新元素,必须定义为一个节点才可以插入单链表中 
    62     s->data =e;   //把e的值赋值给新的节点的data
    63 
    64     s->next=p->next;     //s的next指针存放的是p->next 的指针
    65      
    66     p->next=s;          //p->next指向s, 
    67     
    68     free s;
    69         return 070 }
    71 
    72 
    73 
    74 
    75 //******************************************************************************* 
    76 
    77  //4.单链表的删除  思想(p->next=p->next->next) 
    78  Status ListDelete(LinkList L,int i,ElemType* e) 
    79 {
    80     int j=1;   //记录当前位置 
    81     LinkList p,q;
    82     p=*L;   //p指向当前的地址, 
    83     while(p && j<i)                                 //最坏情况是i=n,所以时间复杂度为o(n) 
    84     {
    85         p=p->next;   //把下一个节点的地址复制给p 
    86         ++j;        //当前位置加1 
    87      } 
    88     if(!p || j>i)   //若p为空或者j大于单链表的长度退出程序 
    89        return -1; 
    90     
    91     
    92     q=p->next;
    93     p->next =q->next;  //这两句相当于p->next =p ->next ->next; 
    94     
    95      *e=q->date;
    96      
    97      return 0;
    98 } 

    比较简单,都写上注释,单链表我研究了一天,都没做出一道题目,就是在单链表中删除所有重复的节点,指针指来指去,头都晕,如果就是删除一个就简单,在单链表没有索引,所以只能靠指针,先排序再删除,现在我还没做出来,就差一步,先放着,做了那么久,累了。

    博客园的文章都是大学时写的,质量不太好。 我的新文章都会发布再新的 blog :https://blog.biyongyao.com 请大家关注哟!!
  • 相关阅读:
    d3的一些总结
    NPashaP的二分图源码部分
    python的web服务器
    d3碰撞源码分析
    测试cnblog文章内部JS
    仿淘宝 vue
    webpack散记---代码分割 和 懒加载
    webpack散记---提取公共代码
    webpack散记--Typescript
    webpack随笔2--编译ES6/ES7
  • 原文地址:https://www.cnblogs.com/biyongyao/p/5451268.html
Copyright © 2011-2022 走看看