线性表单链表的实现

Posted 路人姜。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表单链表的实现相关的知识,希望对你有一定的参考价值。

一、基本操作

 1)定义

typedef int ElementType;
typedef LNode *PtrToLNode;//指向结点的指针
struct LNode{
ElementType data;
PtrToLNode next;
};
typedef PtrToLNode List;

2)初始化
    List L;
    L=(LNode *)malloc(sizeof(LNode));//生成头结点
    L->next=NULL;

3)单链表的建立

①头插法

void CreateListF(List *L){
    int i;
    for(i=1;i<=5;i++){
        PtrToLNode q;
        q=(PtrToLNode)malloc(sizeof(Node));//初始化!!!
        q->data=i;
        q->next=(*L)->next;
        (*L)->next=q;
    }
}

②尾插法

void CreateListR(List *L){
    int i;
    PtrToLNode r;//尾指针
    r=*L;
    for(i=1;i<=5;i++){
        PtrToLNode q;
        q=(PtrToLNode)malloc(sizeof(Node));
        q->data=i;
        r->next=q;
        r=q;
    }
    r->next=NULL;//!!!
}

4)遍历单链表并且求其长度

int GetListLength(List *L){
    PtrToLNode ptr;
    ptr=(*L)->next;
    int length=0;
    while(ptr!=NULL){
        length++;
        printf("%d ",ptr->data);
        ptr=ptr->next;
    }
    printf("\n");
    return length;
}

5)在第i个位置前插入新结点

//有头结点,在第i个位置前插入某个元素,所以i大于等于1小于等于表长
Status ListInsert(List *L,int i,ElementType e){
    int j=0;
    PtrToLNode t,q;
    t=(PtrToLNode)malloc(sizeof(Node));
    q=*L;//不是p->(*L)->next;
    //q指向第i-1个结点
    while(j<i-1&&q){
        j++;
        q=q->next;
    }
    if(j>i-1||!q){//如果i<=1,j<i-1;如果i>表长,q=NULL
        return ERROR;
    }
    t->data=e;
    t->next=q->next;
    q->next=t;
    return OK;
}

6)删除第i个结点

//单链表删除和插入操作都要找第i个位置的前一个结点!

Status ListDelete(List *L,int i,ElementType *e){
    int j=0;
    PtrToLNode t,q;
    t=(PtrToLNode)malloc(sizeof(Node));
    q=*L;
    while(j<i-1&&q){
        j++;
        q=q->next;
    }
    if(j>i-1||!q){
        return ERROR;
    }
    t=q->next;
    *e=t->data;
    q->next=t->next;
    return OK;
}

 

二、栗子

#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
#define OK 1
typedef int Status;//函数返回状态
typedef int ElementType;
typedef struct LNode *PtrToLNode;//指向结点的指针
struct LNode{
ElementType data;
PtrToLNode next;
};
typedef struct LNode Node;
typedef PtrToLNode List;


void CreateListF(List *L);
void CreateListR(List *L);
int GetListLength(List *L);
Status ListInsert(List *L,int i,ElementType e);
Status ListDelete(List *L,int i,ElementType *e);

int main()
{
    List L;
    int length;
    //初始化

    L=(PtrToLNode)malloc(sizeof(Node));//生成头结点
    L->next=NULL;
    //头插法
    CreateListF(&L);
    //遍历单链表并且求其长度
    printf("头插法:");
    length=GetListLength(&L);
    printf("长度:%d\n",length);
    //尾插法
    CreateListR(&L);
    //遍历单链表并且求其长度
    printf("尾插法:");
    length=GetListLength(&L);
    printf("长度:%d\n",length);
    //在第i个位置前插入新结点
    int t=ListInsert(&L,1,666);
    if(t==1){
        printf("链表长度为:%d\n",GetListLength(&L));
    }
    else if(t==-1){
        printf("插入位置越界\n");
    }
    //删除第i个结点
    int e;
    t=ListDelete(&L,1,&e);
    if(t==1){
        length=GetListLength(&L);
        printf("长度:%d\n",length);
        printf("删除的元素为:%d\n",e);
    }
    else if(t==-1){
        printf("删除位置越界\n");
    }

    return 0;
}

void CreateListF(List *L){
    int i;
    for(i=1;i<=5;i++){
        PtrToLNode q;
        q=(PtrToLNode)malloc(sizeof(Node));//初始化!!!
        q->data=i;
        q->next=(*L)->next;
        (*L)->next=q;
    }
}
void CreateListR(List *L){
    int i;
    PtrToLNode r;//尾指针
    r=*L;
    for(i=1;i<=5;i++){
        PtrToLNode q;
        q=(PtrToLNode)malloc(sizeof(Node));
        q->data=i;
        r->next=q;
        r=q;
    }
    r->next=NULL;//!!!
}
int GetListLength(List *L){
    PtrToLNode ptr;
    ptr=(*L)->next;
    int length=0;
    while(ptr!=NULL){
        length++;
        printf("%d ",ptr->data);
        ptr=ptr->next;
    }
    printf("\n");
    return length;
}
//有头结点,在第i个位置前插入某个元素,所以i大于等于1小于等于表长
Status ListInsert(List *L,int i,ElementType e){
    int j=0;
    PtrToLNode t,q;
    t=(PtrToLNode)malloc(sizeof(Node));
    q=*L;//不是p->(*L)->next;
    //q指向第i-1个结点
    while(j<i-1&&q){
        j++;
        q=q->next;
    }
    if(j>i-1||!q){//如果i<=1,j<i-1;如果i>表长,q=NULL
        return ERROR;
    }
    t->data=e;
    t->next=q->next;
    q->next=t;
    return OK;
}
Status ListDelete(List *L,int i,ElementType *e){
    int j=0;
    PtrToLNode t,q;
    t=(PtrToLNode)malloc(sizeof(Node));
    q=*L;
    while(j<i-1&&q){
        j++;
        q=q->next;
    }
    if(j>i-1||!q){
        return ERROR;
    }
    t=q->next;
    *e=t->data;
    q->next=t->next;
    return OK;
}

三、总结

1)存储结构:链式存储结构

2)特点:存储单元不连续

3)存取方式:顺序存取

4)有头结点和无头结点的操作差异

5)删除和插入第i个结点,都是要找到第i-1个结点

 

以上是关于线性表单链表的实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构--单链表简单代码实现(总结)

链表的java实现(单向双向链表,单向链表的反转)

链表的java实现(单向双向链表,单向链表的反转)

C中线性表和链表的区别

[Data Structure]线性表Linear List2

数据结构与算法学习笔记 线性表Ⅱ