二、数据结构-线性表链式存储

存储密度 = (结点数据本身所占的存储量)/(结点结构所占的存储总量)

2.1链表结构定义

链表结构

链表完整结构:(头指针/头结点)+(首元结点)+NULL

typedef struct LNode{
    Elemtype data;
    struct LNode *next;
}LNode,*LinkList;
//这里定义用到了递归

链表初始化:

int Initial_LinkList(LinkList &L){
    L=new LNode;
    if(!L){return -1;}
    L.next=NULL;
    return 0;
}

int main(){
    LinkList L;
    Initial_LinkList(L);
}

说明:函数传参什么时候使用指针的引用?
一般来说,用指针做参数,表示把变量的地址传递给子函数,子函数只能修改指针所指变量的值,并不能修改指针的指向。如果想用修改指针的指向,就要用指针的指针,或者指针的引用。指针引用的典型例子:

  • 场景一:
    主函数中定义了指针但并未申请空间(野指针),要将指针做参数传给子函数,在子函数中申请空间,这时候一定要用指针的引用(因为指针所指的这块内存发生了改变,或者说指针的指向发生了改变)。
  • 场景二:
    链表做参数时,在遍历,查找操作子函数时,链表不会发生改变,那就用头结点的指针做参数就可以了。但是在增加,修改,删除这种操作时,链表头结点指针所指的这块内存会发生改变,也就是指针的指向可能会发生改变,这种情况下就要头指针的引用。同样在二叉树和图的子函数中如果修改二叉树和图,那就要用指针的引用。
  • 实在搞不清楚,就记住: 用引用总是没有问题的。

2.2销毁链表

int Destroy_LinkList(LinkList &L){
    LNode *p;
    while(L){
        p=L;
        L=L->next;
        delete p;
    }
}

2.3清空链表

顺序表清空只要length归零,这是因为顺序表生成后最大长度是一定的,所以只要将标记位归零即可。链表的长度是灵活的,所以清空需要释放除头结点以外其他结点的内存。

int Clear_LinkList(LinkList &L){
   LinkList p,q;
   p=L->next;   //跳过头结点
   while(p)       //判断是否到表尾 
      {  q=p->next; delete p; p=q;   }  //释放后续结点内存空间
   L->next=NULL;   //头结点指针域置为空 
   return OK;
 }

2.4取值

int Get_LinkList(LinkList L,int n){
    LNode *p=L;int i=0;
    while(p&&i<n){
        i++;
        p=p->next;
    }
    if(!p||i>=n){
        return -1;
    }else{
        return p->data;
    }

说明:
1、顺序表的遍历条件是for (i=0;i< L.length;i++),链表的遍历条件是while(p){p=p->next;}
2、链表的长度是未知的,所以在做查找、取值、插入、删除时都可能超出序号范围,且不能预先判断,要在遍历过程中设置判断条件。

2.5循环列表

循环列表与单列表区别是:从循环链表任何一个结点都可以找到其他所有结点,而单链表做不到。循环列表可看成周长变化的环,初始化L->next=L,遍历结束条件p!=L。循环列表可以有头结点或没有,操作上会有区别。

2.6双向链表

双向链表每个结点有两个指针域。双向循环链表是一种特殊情况。

2.7作业

作业1:将两个递增有序链表A、B合并为一个递增有序链表C,要求不另外占用其他存储空间,不允许有重复元素。

/*
思路:
1、C头指针等于A的头指针,p用来保存C的尾结点,初始位置在Lc ;p=Lc=La; 
2、比较A、B首元结点pa、pb的大小,如果pa小,将Lc的next指向pa,pa向下一个结点;
    if (pa->data<pb->data){p->next=pa;p=pa;pa=pa->next;}
3、如果pb小,将Lc的next指向pb,pb向下一个结点;
    if(pa->data>pb->data){p->next=pb;p=pb;pb=pb->next;}
4、如果pa、pb相等,将Lc的next指向pa,pa向下一个结点,删除pb;
    if(pa->data=pb->data){p->next=pa;p=pa;pa=pa->next;del=pb;pb=pb->next;delete del;}
5、循环上述2、3、4直到pa或pb等于NULL(链尾);while(pa&&pb){}
6、再把A或B剩下的部分接到C的后面;
    p->next=pa?pa:pb;
7、删除B的头结点;delete Lb; 
*/
void MergeLinkList(LinkList &La,LinkList &Lb,LinkList &Lc){
    LNode *p,*pa=La->next,*pb=Lb->next,*del;
    p=Lc=La;
    while(pa&&pb){
        if (pa->data<pb->data){
            p->next=pa;
            p=pa;
            pa=pa->next;
        }else if (pa->data>pb->data){
            p->next=pb;
            p=pb;
            pb=pb->next;
        }else{
            p->next=pa;
            p=pa;
            pa=pa->next;
            del=pb;
            pb=pb->next;
            delete del;
        }
    }
    
    p->next=pa?pa:pb;
    delete Lb; 
}

作业2:设计一个算法,通过遍历一趟,将链表La中所有结点的链接方向逆转,仍利用原表的存储空间。

int Invert_LinkList(LinkList &L){
    LNode *s1,*s2,*p=L,*r;
    if(p->next){
        r=s1=p=p->next;
     }else{return -1;}
    if(p->next){
        s2=p=p->next;
    }else{return -1;}
    p=p->next;
    while(p){
        s2->next=s1;
        s1=s2;
        s2=p;
        p=p->next;
    }
    s2->next=s1;
    L->next=s2;
    r->next=NULL;
    return 0;
}

作业3:已知长度为n线性表采用顺序存储结构,请写一个算法删除线性表中所有值为item的元素。

void RemoveElem(Sqlist &L){
    int item;
    printf("请输入要删除的元素:\n");
    scanf("%d",&item);
    
    int n=L.length;
    int j=0;
    for(int i=0;i<n;i++){
        if(L.head[i]!=item){L.head[j]=L.head[i];j++;}
    }
    L.length=j;
}

易错点:
条件语句经常把判断条件“==”写成“=”。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容