大话数据结构 -- 单链表的创建、查找、增删。

//
//  main.cpp
//  单链表
//
//  Created by Maggie on 18/8/20.
//  Copyright © 2018年 Maggie. All rights reserved.
//

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
/* 线性表的单链表存储结构 */
typedef struct  Node
{
    int data;
    struct Node *next;
}Node;

// 定义LinkList
typedef struct Node *LinkList;

/* 初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
 操作结果:用e返回L中第i个数据元素的值 */

int GetElem(LinkList L,int i){
    int j=1;
    LinkList p;
    p=L->next;    //注意p指向第一个结点!!(不是头结点)
    
    while(p && j<i){
        p=p->next;
        j++;
    }
    // 第i个结点不存在
    if(!p ||j>i)
    return 0;
    int e=p->data;
    return e;
}


/* 初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
 操作结果:在L中第i个结点位置之前插入新的数据元素e,L的长度加1
 */
LinkList ListInsert(LinkList L, int i,int e){
    LinkList p = L;
    int j;
    j=1;
    // 找到第i-1个结点
    while(p && j<i){
        p=p->next;
        j++;
    }
    if(!p || j>i){
        return NULL;
    }
    // 生成新结点(C标准函数)
    LinkList s;
    s = (LinkList)malloc(sizeof(Node));
    s->data=e;
    s->next=p->next;
    p->next=s;
    
    return L;
}


/* 初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
 操作结果:删除L的第i个结点,并用e返回其值,L的长度-1
 */
int ListDelete(LinkList L, int i){
    LinkList p= L;
    //p=L->next;
    int j=1;
    while(p && j<i){
        p=p->next;
        j++;
    }
    if(!p ||j>i){
        return NULL;
    }
    LinkList q;
    q=p->next;
    p->next=p->next->next;
    int e=q->data;
    free(q);
    return e;
    
}


// 随机产生n个元素的值,建立带表头结点的单链线性表(头插法)
void createListHead(LinkList L, int n){
    LinkList p;
    int i=0;
    // 初始化随机数
    //srand(time(0));
    
    while(i<n){
        p=(Node *)malloc(sizeof(Node));
        
        i++;
        p->data=600/i +1;

        p->next=L->next;
        L->next=p;
       
    }
    
}


// 随机产生n个元素的值,建立带表头结点的单链线性表(尾插法)
void createListTail(LinkList L, int n){
    LinkList p,r;
    int i=0;
    // 初始化随机数
    //srand(time(0));
    r=L;
    while(i<n){
        p=(Node *)malloc(sizeof(Node));
        
        i++;
        p->data=600/i +1;
        
        r->next=p;
        r=p;
        
    }
    
    //表示当前链表结束
    r->next=NULL;
    
}

// 初始条件:顺序线性表L已存在,操作结果:将L置为空表
LinkList ClearList(LinkList L){
    LinkList p,q;
    p=L->next;
    while(p){
        q=p->next;			//保存下一个数
        free(p);
        p=q;
    }
    //  置头结点指针域为空
    L->next=NULL;
    return L;
}


int main(void){
    LinkList L ;
    L=(Node *)malloc(sizeof(Node));
    L->next=NULL;
    createListHead(L, 5);
    //createListTail(L, 5);
    
    //ListInsert(L,1,1);
    //int e=ListDelete(L,1);
    //cout<<e;

    // ClearList(L);

    int elem = GetElem(L,1);
    cout<<elem;
}

代码亲测运行无误。是在书上给出的代码经修改后完成的,书上的代码在指针上似乎有点问题,最开始定义的Linklist就是Node * 的指针类型,后面又Linklist * L ,很明显是错误的。所以做了修改。

猜你喜欢

转载自blog.csdn.net/qq_36770641/article/details/81872897