c++单链表的相关操作

原创 2015年07月11日 08:50:21

小弟才疏學淺 如有錯誤請不吝指正


#include<stdio.h>
#include<iostream>
#include<stdlib.h>///加stdlib可以用malloc
typedef struct LNode{
    int data;    ///数据域
    struct LNode *next; ///指針域
}LNode, *LinkList; ///"LNode *p" and "LinkList p" has the same effect

int LinkListlength(LinkList L){
    int i=0;
    LNode *p=L->next;
    while(p!=NULL){
        p=p->next;
        i++;
    }
    return i;
}

LinkList CreatList1(LinkList &L){
    printf("頭插法建立單鏈表\n");
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));///L为頭節點
    L->next=NULL;///初始为空链表
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;///node:s insert complete
        scanf("%d",&x);
    }
    return L;
    ///头插法输入与输出顺序是反的
}

LinkList CreatList2(LinkList &L){
    printf("尾插法建立單鏈表\n");
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    LNode *s;///指向要插入節點的指針
    LNode *r=L;///尾指針
    scanf("%d",&x);
    while(x!=9999){
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;///插入完成後尾指針置空
    return L;
}

void printList(LinkList L){
    printf("輸出單鏈表\n");
	L=L->next;///跳過頭節點再輸出
	while(L!=NULL){
        printf("%d ",L->data);
        L=L->next;
	}
}

LNode *GetElemById(LinkList L,int i){
    int j=1; ///计数用
    LNode *p=L->next; ///L头节点的指针给p 使p指向第一個節點
    if(i==0)
        return L;///如果i=0 直接返回头节点
    if(i<1)
        return NULL;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    return p;
}

LNode *GetElemByValue(LinkList L,int i){
    LNode *p=L->next;
    while(p!=NULL&&p->data!=i)
        p=p->next;
    return p;
}

LinkList insertNode(LinkList &L,int i){
    ///找到第i-1個節點 在其後插入新節點
    ///也可以理解爲在第i個節點前插入新節點,但是前提是能夠從頭節點找到第i個節點的前驅節點
    int k=LinkListlength(L);
    if(i<1)
        return NULL;
    if(i>k)
        return NULL;
    LNode *s=(LinkList)malloc(sizeof(LNode));
    s->data=1;///插入數據爲1
    s->next= GetElemById(L,i-1)->next;
    GetElemById(L,i-1)->next=s;
    return L;
}

LinkList insertNode_explore(LNode *p){
    ///補充接上面的方法 如果不能從頭節點找到p節點的前驅節點 還要在p前插入新節點 就要這麼做
    LNode *s=(LinkList)malloc(sizeof(LNode));
    s->data=2;
    s->next=p->next;///還是先在p後插入
    p->next=s;
    temp=s->data;///再交換他們的數據域就可以了
    s->data=p->data;
    p->data=temp;
    return p;
}

LinkList deleteNode(LinkList &L,int i){
    int k=LinkListlength(L);
    if(i<1)
        return NULL;
    if(i>k)
        return NULL;
    LNode *p;
    LNode *q;
    p=GetElemById(L,i-1);
    q=p->next;///把要刪除的節點先拿出來 一會free
    p->next=q->next;
    free(q);
    return L;
}

LinkList deleteNode_explore(LNode *p){
    ///要求刪除給定節點*p 可以通過刪除p的後繼節點來實現
    ///就是將後繼節點的數據域賦予自身 然後刪除後繼節點
    LNode *s=(LinkList)malloc(sizeof(LNode));
    LNode *q=(LinkList)malloc(sizeof(LNode));
    q=p->next;
    p->data=q->data;
    p->next=q->next;
    free(q);
    return p;
}

int main(){
	///LinkList L = CreatList1(L);
	///LinkList L=CreatList2(L);
	///printList(L);
    ///deleteNode(L,1);
    ///printList(L);
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

单链表相关操作

#include "test.h"SListNode* BuyNode(DataType x) { SListNode* node = (SListNode*)malloc(sizeof(SL...

单链表相关操作

版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7393134 链表是最基本的数据结构,面试官...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

链表的相关操作

要掌握链表的相关操作,必须先熟练掌握c语言中结构体指针的应用,并掌握相关操作算法原理 #include #include #include typedef int ElemType; ty...

链表的相关操作

#include #include #include typedef struct LNode { int data; struct LNode * next; }node,*p...

链表的相关操作

链表的相关操作

单链表的相关操作

#ifndef _SLIST_H #define _SLIST_H#ifdef __cplusplus extern "C" { #endif /*******1. 不带头结点的单链表*****...

对单链表的相关操作

单链表的学习是数据结构中最基本的知识,这个例子是我现实的一个单链表,并对这个单链表执行一系列的操作。 下图是实现的截图: 下面给出实现的C++代码: #include #include...

单向链表的相关操作

单向链表的c语言实现

单向链表相关操作

typedef char DataType; typedef struct node { DataType data; struct node *next; }NODE; /********...

单向链表相关操作

关于链表操作相关编程比较棘手,并不是说不会编,主要是每次编写都要调试很久,特别是单向链表排序,在处理链表边界时感觉很麻烦,这两天脚崴了不大方便做其他的事儿,就在宿舍编写简单程序!下面是单向链表的相关操...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)