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;
}


单链表基本操作详解

#  单链表基本操作 文中提到的内容的链接一并列在这里: 顺序表:http://blog.csdn.net/bitboss/article/details/51559175 冒泡排序:...
  • bitboss
  • bitboss
  • 2016年06月04日 22:12
  • 2870

数据结构单链表的各种操作C++实现

//该程序实现了线性表的链式存储结构之单链表和各项操作 #include #include using namespace std;//****线性表和一些基础的定义***** #define E...
  • huafeihuazyr
  • huafeihuazyr
  • 2016年06月26日 20:53
  • 176

C++单链表基本算法代码

#include #include using namespace std; struct Data{//数据节点类型 string key; string name; int age; };...
  • cherishwangq
  • cherishwangq
  • 2016年11月05日 09:34
  • 479

c++ 单链表基本操作

#include #include #include #include #include /*c++实现简单的单链表操作*/ using namespace std; typedef str...
  • cfan0801
  • cfan0801
  • 2012年03月13日 21:01
  • 24592

常用算法整理:链表相关

链表的考点链表很多时候都是考察基本功,因为链表题大部分都不是很复杂,主要是对指针的操作,当然也有难的。 简单的题目包括 删除/插入节点、翻转、去重、排序等,难度高一些的题目依然是这些,不过会有一些条...
  • lihongxun945
  • lihongxun945
  • 2016年04月24日 15:54
  • 1562

c++实现链表的倒序操作

c++实现链表的倒序操作首先是Node.h #pragma once #include using namespace std; class LinkNode { public: int ...
  • HurryRabbit
  • HurryRabbit
  • 2017年09月17日 16:36
  • 165

C++实现线性链表的基本操作

C++实现顺序结构线性表的基本操作
  • sinat_34474705
  • sinat_34474705
  • 2017年01月10日 13:55
  • 1567

c++实现单链表基本操作

程序媛决定好好学习写代码 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时...
  • u011200403
  • u011200403
  • 2017年02月13日 19:33
  • 1095

单链表的实现(C++版)

// 带头节点单链表的C++实现 #include "stdafx.h" #include #include using namespace std; class CNode ...
  • piaopiaopiaopiaopiao
  • piaopiaopiaopiaopiao
  • 2014年05月12日 20:27
  • 6632

c++学习笔记—单链表基本操作的实现

用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表)、结点的查找、删除、排序、打印输出、逆置、链表销毁等基本操作。 IDE:vs2013 具体实现代码如下: #includ...
  • xujian_2014
  • xujian_2014
  • 2015年01月14日 21:13
  • 1211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++单链表的相关操作
举报原因:
原因补充:

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