关于单链表的一些基本操作

#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;

/* 定义单链表数据 */
typedef char ElemType;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LinkList;

/* 单链表的初始化 */
void InitList(LinkList *&L)
{
    L = (LinkList *)malloc(sizeof(LinkList));
    L->next=NULL;
}

/* 向单链表中插入数据元素 */
bool ListInsert(LinkList *&L,int x,char e)
{
    int j = 0;
    LinkList *p = L, *s;
    while(p!=NULL && j<x-1)
    {
        p = p->next;
        j++;
    }
    if(p==NULL)
    {
        return false;
    }
    else
    {
        s = (LinkList *)malloc(sizeof(LinkList));
        s->data = e;
        s->next = p->next;
        p->next = s;
        return true;
    }
}

/* 输出单链表 */
void DispList(LinkList *L)
{
    LinkList *p = L->next;
    while(p!=NULL)
    {
        printf("%c",p->data);
        p = p->next;
    }
    printf("\n");
}

/* 求单链表的长度 */
int ListLength(LinkList *L)
{
    LinkList *p = L->next;
    int i = 0;
    while(p!=NULL)
    {
        i++;
        p = p->next;
    }
    return i;
}

/* 查看单链表是否为空 */
bool ListEmpty(LinkList *L)
{
    return L->next==NULL;
}

/* 求单链表中某个数据元素值 */
bool GetElem(LinkList *L,int i, ElemType &e)
{
    LinkList *p = L;
    int j = 0;
    while(p!=NULL && j < i)
    {
        p=p->next;
        j++;
    }
    if(p==NULL)
    {
        return false;
    }
    else
    {
        e = p->data;
        return true;
    }
}

/* 在单链表中查找元素 */
int LocateElem(LinkList *L,ElemType e)
{
    LinkList *p = L;
    int i = 0;
    while(p!=NULL && p->data!=e)
    {
        p = p->next;
        i++;
    }
    if(p==NULL)
    {
        return 0;
    }
    else
    {
        return i;
    }
}

/* 删除单链表中第 i 个元素*/
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
    int j = 0;
    LinkList *p = L, *q;
    while(p!=NULL && j < i - 1)
    {
        p = p->next;
        j++;
    }
    if(p==NULL)
        return false;
    else
    {
        q = p->next;
        if(q==NULL)
            return false;
        e = q->data;
        p->next = q->next;
        free(q);
        return true;
    }
}

/* 删除单链表 */
void DestroyList(LinkList *&L)
{
    LinkList *p = L;
    LinkList *q = p->next;
    while(q!=NULL)
    {
        free(p);
        p = q;
        q = p->next;
    }
    free(p);
}

int main( )
{
    LinkList *h;
    ElemType e;
    printf("单链表的基本运算如下:\n");
    printf("(1)初始化单链表\n");
    InitList(h);
    printf("(2)依次采用尾插法插入 a,b,c,d,e 元素\n");
    ListInsert(h,1,'a');
    ListInsert(h,2,'b');
    ListInsert(h,3,'c');
    ListInsert(h,4,'d');
    ListInsert(h,5,'e');
    printf("(3)输出单链表:");
    DispList(h);
    printf("(4)单链表h的长度 = %d\n",ListLength(h));
    printf("(5)单链表h为%s\n",(ListEmpty(h)?"":"非空"));
    GetElem(h,3,e);
    printf("(6)单链表h的第3个元素 = %c\n",e);
    printf("(7)元素a的位置 = %d\n",LocateElem(h,'a'));
    printf("(8)在第4个元素位置上插入f元素\n");
    ListInsert(h,4,'f');
    printf("(9)输出单链表h:");
    DispList(h);
    printf("(10)删除h的第3个元素\n");
    ListDelete(h,3,e);
    printf("(11)输出单链表h:");
    DispList(h);
    printf("(12)释放单链表h\n");
    DestroyList(h);
    return 0;
}

 

posted @ 2018-03-19 21:01  会飞的鱼摆摆  阅读(242)  评论(0编辑  收藏  举报