数据结构-线性表的链式存储

1. 在链表初始化和头插法时需要注意二级指针。具体可参考文章 https://www.cnblogs.com/WeyneChen/p/6672045.html

2. 在链表创建时,需要注意是不是带有头结点的链表

//线性表的链式存储 
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 101
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
}Node; 
typedef struct Node *LinkList;
//用e返回L中第i个元素的值,假设有头结点 
Status GetElem(LinkList L,int i,ElemType *e){
    int j=1;
    LinkList p;
    p=L->next;
    while(p&&j<i){
        p=p->next;
        ++j;
    }
    if(!p||j>i){
        return ERROR; 
    }
    *e= p->data;
    return OK;
} 
//在L中第i个位置之前插入新的元素e 
Status ListInsert(LinkList L,int i,ElemType e){
    int j=1;
    LinkList p,s;
    p=L->next;
    while(p&&j<i){
        ++j;
        p=p->next;
    }
    if(!p||j>i){
        return ERROR;
    }
    s=(LinkList)malloc(sizeof(Node));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
//删除L中第i个位置,返回元素e
Status LinkListDelete(LinkList L,int i,ElemType *e){
    int j=1;
    LinkList p,q;
    p=L;
    while(p->next&&j<i){
        ++j;
        p=p->next;
    }
    if(!p||j>i){
        return ERROR;
    }
    q=p->next;//第i个位置为p->next; 
    p->next=q->next;
    free(q);
    return OK;
}

 
/*初始化链表,传的是二级指针,操作的是一级指针的地址*/
Status InitList(LinkList *L){   
    *L=(LinkList)malloc(sizeof(Node));  //这里的*L就是Node节点的指针对象
    if(!(*L))   //申请内存失败
        return ERROR;
    (*L)->next=NULL;
    return OK;
}
//建立单链表 初始化头插法 n,表示插入的个数  此链表有头结点 
Status CreateListHead(LinkList *L,int n){
    LinkList p;
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
    for(int i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(Node));
        p->data=i;
        p->next=(*L)->next;
        (*L)->next=p;
    } 
    return OK;
}
//建立单链表 初始化尾查法 n,表示插入的个数
Status CreateListTail(LinkList *L,int n){
    LinkList p,r;
    (*L)=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;
    r=(*L); 
    for(int i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(Node));
        p->data=i;
        r->next=p;
        r=p; 
    }
    r->next=NULL;
    return OK;
} 
//遍历单链表
Status TraverseList(LinkList L){
    LinkList p;
    p=L->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
    return OK;
}

//清空单链表
Status ClearList(LinkList L){
    LinkList p,q;
    p=L->next;
    while(p){
        q=p->next;
        free(q);
        p=q;
    }
    L->next=NULL;
}

//主函数 
int main(){
    LinkList L1;   //创建一个节点,用于头插法
    LinkList L2;   //创建一个节点,用于尾插法
 
    printf("......头插法......\n");
    InitList(&L1);  //初始化
    CreateListHead(&L1,5);
    LinkList p,p1;
    TraverseList(L1);
    printf("\n");
    
    printf("......尾插法......\n");
    InitList(&L2);  //初始化
    CreateListTail(&L2,5);
    TraverseList(L2);
    printf("\n");
    
    //获取元素的值
    ElemType e=0;
    GetElem(L2,1,&e);
    printf("%d \n",e);
    
    //删除一个指定位置的元素
    printf("删除L1中2号元素:");
    LinkListDelete(L1,2,&e);
    TraverseList(L1);
    printf("\n"); 
    return 0;
}

 

posted @ 2021-01-14 14:43  wyqgzq  阅读(154)  评论(0)    收藏  举报