单链表与6个基本操作

0、宏定义与单链表结构体

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define error 1
#define OK 0
typedef int ElemType;
typedef int Status;

typedef struct LNode{
        ElemType data;
        struct LNode *next;
        }LNode; //单链表结点结构体

typedef LNode* LinkList;//单链表结点指针


1、建立一个单链表


//建立链表,为一个头结点指针分配空间,要提前有一个头结点指针 
Status  InitList(LinkList &L)//参数为指针的引用,使在子函数中分配的空间不会被释放 
{
    L=(LinkList)malloc(sizeof(LNode));//为头结点指针分配动态空间
    if(L==NULL) 
    {
        printf("动态内存分配失败\n");
        exit(0); 
    }
    L->next=NULL;

}

2、销毁一个单链表(只留一个头结点指针,头结点空间释放)

Status DestroyList(LinkList &L)
{
    LinkList p,q;
    p=L;
    q=p->next;
    while(p)
    {
      free(p);
      p=q;
      if(q)
      {
        q=q->next;          
      }
    }  
    return OK;
}

3、清空一个单链表(保留头结点,包括头结点指针和头结点空间)

Status ClearList(LinkList &L)//
{
    LinkList p,q;
    p=L->next;
    q=p->next;
    while(p)
    {
        free(p);
        p=q;
        if(q)
        {
            q=q->next;
        }
    } 
    L->next=NULL;
    return OK;
}

4、插入一个结点

//插入一个结点,传入头结点指针,在第i个元素前插入一个元素 
Status InsertList(LinkList &L,int i,ElemType e)
{
    LinkList p;
    p=L;
    j=0;
    while(p&&j<i-1)//使指针p指向第i个元素的前驱,可以在表尾后插入元素 
    {
        p=p->next;
        j++
    }
    if(!p||j>i-1)
    {
        return error; 
    }
    LinkList s;
    s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next; 
    p->next=s;
    return OK;
}

5、删除一个结点

//删除一个结点(删除结点涉及三个位置的指针) 
//传入头结点指针,删除链表中第i个元素,并获得该结点数据域 
Status ListDelete(LinkList &L,int i,ElemType &e) 
{
    LinkList p,q;
    p=L;
    j=0;
    while(p->next&&j<i-1)
    {
        p=p->next;
        j++;
    } 
    if(!(p->next)||j>i-1)
    {
        return error;
    }
    q=p->next;p->next=q->next;
    e=q->data;free(q);
    return OK; 

} 

6、获取第i个结点的数据

Status GetElem(LinkList L,int i,ElemType &e)
{
    LinkList p;
    p=L.next;
    int j=1;


    while(p||j<i)//j的最大可能值为i 
    {
        p=p->next;
        j++
    }
    if(p||j>i)
    {
        return error;
    } 
    else
    {
        e=p->data;
        return OK;
    } 
}

猜你喜欢

转载自blog.csdn.net/BruthYU/article/details/52761698