单链表的实现

上上次上机课花差不多两个小时才搞定的,经测试可行,虽然有点粗糙。。。。

/*by Wadye*/

#include <iostream>
#include <cstdio>
#include <cstring>

#define Elemtype int

using namespace std;

typedef enum { ERROR, OK } Status;


//单链表的储存结构
typedef struct LNode
{
    Elemtype data;   //结点的数据域
    struct LNode *next;   //结点的指针域
} LNode,*LinkList;  //LinkList为指向结构体LNode的指针类型

//单链表的初始化
Status InitList_L(LinkList &L)
{
    //构造一个空的单链表L
    L = new LNode;  //生成新结点作为头结点,用头指针L指向头结点
    L->next = NULL;   //头结点的指针域置空
    return OK;
}

//按序号查找
Status GetElem_L(LinkList L, int i)
{
    //在带头结点的单链表L中查找第i个元素
    int e, j;
    LinkList p;
    p = L->next;   //初始化,p指向第一个结点,j为计数器
    j = 1;
    while(p && j < i)   //顺链向后扫描,知道o指向第i个元素或为空
    {
        p = p -> next;
        j++;
    }
    if(!p || j > i)return ERROR;   //第i个元素不存在
    e = p -> data;     //取第i个元素
    printf("%d\n",e);
    return OK;
}

//按值查找
LNode *LocateElem_L(LinkList L, Elemtype e)
{
    //在带头结点的单链表L中查找值为e的元素
    LinkList p;
    p = L -> next;
    while(p && p -> data != e)
        p = p -> next;      //寻找满足条件的结点
        //printf("%d\n",p);
    return p;    //返回L中值为e的数据元素位置,查找失败返回NULL
}

//插入
Status ListInsert_L(LinkList &L, int i, Elemtype e)
{
    //在带头结点的单链表L中第i个位置之前插入元素e
    LinkList p;
    LinkList ss;
    LinkList s;
    int j;
    p = L;
    j = 0;
    while(p && j < i-1)   //寻找第i-1个结点
    {
        p = p -> next;
        j++;
    }
    if(!p || j > i-1)return ERROR;  //i大于表长+1或者小于1
    s = new LNode;    //生成新结点
    s-> data = e;     //将结点s的数据域置为e
    s -> next = p -> next;   //将结点s插入L
    p -> next = s;
    p = L ;
    for(int i = 0; p->next->next!=NULL; i++)
    {
        p = p -> next;
        printf("%d->",p->data);

    }
    printf("%d",p->next->data);
    printf("\n");
    return OK;
}

//删除
Status ListDelete_L(LinkList &L, int i)
{
    //在带头结点的单链表L中,删除第i个元素,并由e返回其值
    LinkList p;
    LinkList q;
    int e;
    int j;
    p = L;
    j = 0;
    while(p -> next && j < i-1)   //寻找第i-1个结点
    {
        p = p -> next;
        j++;
    }
    if(!p -> next || j > i-1)return ERROR;  //i大于表长+1或者小于1
    q = p -> next;    //临时保存被删结点的地址以备释放
    p -> next = q -> next;    //改变删除结点前驱结点的指针域
    e = q -> data;     //保存删除结点的数据域
    delete q;     //释放删除结点的空间
    p = L ;
    for(int i = 0; p->next->next!=NULL; i++)
    {
        p = p -> next;
        printf("%d->",p->data);

    }
    printf("%d",p->next->data);
    printf("\n");
    return OK;
}

//前插法创建单链表
void CreateList_F(LinkList &L, int n)
{
    LinkList p;
    L = new LNode;
    L -> next = NULL;    //建立一个带头结点的空链表
    for(int i = n; i > 0; i--)
    {
        p = new LNode;      //生成新结点
        cin >> p -> data;    //输入元素值
        p -> next = L -> next;
        L -> next = p;           //插入到表头
    }
    p = L ;
    for(int i = 0; p->next->next!=NULL; i++)
    {
        p = p -> next;
        printf("%d->",p->data);

    }
    printf("%d",p->next->data);
    printf("\n");
}

//后插法创建单链表
void CreateList_L(LinkList &L, int n)
{
    LinkList r;
    LinkList p;
    L = new LNode;
    L -> next = NULL;    //建立一个带头结点的空链表
    r = L;     //尾针r指向头结点
    for(int i = 0; i < n; i++)
    {
        p = new LNode;      //生成新结点
        cin >> p -> data;    //输入元素值
        p -> next = NULL;
        r -> next = p;      //插入到表尾
        r = p;       //r指向新的尾结点
    }
    p = L ;
    for(int i = 0; p->next->next!=NULL; i++)
    {
        p = p -> next;
        printf("%d->",p->data);

    }
    printf("%d",p->next->data);
    printf("\n");
}

//菜单
void menue()
{
    printf("1.前插法创建单链表\n");
    printf("2.后插法创建单链表\n");
    printf("3.插入\n");
    printf("4.删除\n");
    printf("5.按序号查找\n");
    printf("6.按值查找\n");
}

int main()
{
    int sele;
    LinkList l;
    int n, e, i;
    menue();
    while(cin >> sele)
    {

        switch(sele)
        {
        case 1:
            printf("请输入链表的长度:");
            cin >> n;
            printf("\n");
            CreateList_F(l, n);
            break;
        case 2:
            printf("请输入链表的长度:");
            cin >> n;
            printf("\n");
            CreateList_L(l, n);
            break;
        case 3:
            printf("请输入要插入的元素:");
            cin >> e;
            printf("\n");
            printf("请输入要插入的位置:");
            cin >> i;
            printf("\n");
            ListInsert_L(l, i, e);
            break;
        case 4:
            printf("请输入要删除的位置:");
            cin >> i;
            printf("\n");
            ListDelete_L(l, i);
            break;
        case 5:
            printf("请输入要查找的元素位置:");
            cin >> i;
            GetElem_L(l, i);
        case 6:
            printf("请输入要查找的元素:");
            cin >> e;
            LocateElem_L(l, e);
            break;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值