c++单链表的相关操作

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


#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++ 数据结构
上一篇Ubuntu链接XP32位虚拟机上的orace11g数据库
下一篇拉格朗日中值定理 简明版
想对作者说点什么? 我来说一句

单链表实验报告C++

2013年03月31日 100KB 下载

单链表的有关操作

2011年11月13日 6KB 下载

数据结构c版本

2017年11月17日 2.07MB 下载

单链表尾插法(C++源代码)

2011年10月31日 878B 下载

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

2011年11月10日 2KB 下载

没有更多推荐了,返回首页

关闭
关闭