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


相关文章推荐

c语言 单链表的相关操作

  • 2012年02月19日 16:35
  • 3KB
  • 下载

单链表及其相关操作

  • 2012年09月18日 22:51
  • 4KB
  • 下载

我面试遇到的C语言中单链表相关的操作粗浅实现

主要包括单链表中节点的插入, 删除, 反转链表, 链表排序, 查询链表中第几个或倒数第几个节点的值(即将补充的有链表是否有环, 两个链表是否相交以及第一个公共节点)....

C/C++单链表的一些操作

  • 2015年07月30日 21:27
  • 3.52MB
  • 下载

带头结点单链表操作C++的实现

  • 2015年04月07日 20:06
  • 4KB
  • 下载

单链表的相关操作之创建

单链表的创建 带头结点 不带头结点 代码示例#include #include using namespace std; struct ListNode{ int val; ListN...

C++单链表的基本操作

  • 2016年06月20日 16:27
  • 4KB
  • 下载

自己写的c++单链表操作

  • 2014年09月17日 21:27
  • 116KB
  • 下载

对单链表的相关操作

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

单链表所有操作(C++源码)

  • 2011年03月29日 10:58
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++单链表的相关操作
举报原因:
原因补充:

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