数据结构上机实验:单链表操作

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

typedef struct Node
{
    char c;
    struct Node *next;
}*LinkList,LNode;

//初始化单链表h
LinkList Init(LinkList &h)
{
    h=(LNode*)malloc(sizeof(LNode));
    if(h==NULL)
    {
        cout<<"没有足够的内存空间"<<endl;
        exit(0);
    }
    h->next=NULL;
    return h;
}
//尾差法插入元素
void InsertNum(LinkList &h,int n)
{
    LinkList r,s;
    r=h;
    for(int i=0;i<n;i++)
    {
        s=(LNode*)malloc(sizeof(LNode));
        r->next=s;
        cin>>s->c;
        r=s;
    }
    r->next=NULL;
}
//输出单链表h
void outputLinkList(LinkList h)
{
    LinkList p=h->next;
    while(p!=NULL)
    {
        cout<<p->c<<" ";
        p=p->next;
    }
}
//求单链表h的长度
int GetLength(LinkList h)
{
    LinkList p;
    p=h->next;
    int count=0;
    while(p!=NULL)
    {
        count++;
        p=p->next;
    }
    return count;
}
//输出单链表的长度
void outputListLength(LinkList h)
{
    cout<<"当前链表的长度为: "<<GetLength(h)<<endl;
}
//判断单链表h是否为空表
void Empty(LinkList h)
{
    if (h->next==NULL)
        cout<<"该链表为空!"<<endl;
    else
        cout<<"该链表不为空!"<<endl;
}
//输出单链表h的第n个元素
void outputNthNum(LinkList h,int n)
{
    int curLen=GetLength(h);
    if(n<=0||n>curLen)
    {
        cout<<"位置输入错误!"<<endl;
        exit(0);
    }
    else
    {
        LinkList p=h->next;
        for(int i=1;i<n;i++)
        {
            p=p->next;
        }
        cout<<"该链表的第"<<n<<"个元素为: "<<p->c<<endl;
    }
}
//输出元素a的位置
void outputNumPosition(LinkList h,char a)
{
    LinkList p=h->next;
    int position=1;
    while(p!=NULL)
    {
        if(p->c==a)
        {
            cout<<"元素"<<a<<"在链表中的位置为 :"<<position<<endl;
        }
        p=p->next;
        position++;
    }
    if(position-GetLength(h)>1)
        cout<<"元素"<<a<<"在链表中不存在!"<<endl;
}
//在第N个位置上插入元素f
void InsertNumOnth(LinkList &h,int n,char a)
{
    int len=GetLength(h);
    if(n<=0||n>len)
    {
        cout<<"位置错误,不能插入!"<<endl;
        exit(0);
    }
    else
    {
        LinkList p=h->next;
        LinkList temp;
        temp=(LNode*)malloc(sizeof(LNode));
        if(n==1)
        {
            temp->next=p;
            h->next=temp;
            temp->c=a;
        }
        else
        {
            for(int i=2;i<n;i++)
            {
                p=p->next;
            }
            temp->next=p->next;//3
            p->next=temp;
            temp->c=a;
        }
    }
}
//删除链表的第n个元素
void deleteNthNum(LinkList &h,int n)
{
    if(n<=0||n>GetLength(h))
    {
        cout<<"删除位置输入错误!"<<endl;
        exit(0);
    }
    else
    {
       int j=0;
       LinkList p=h,q;
       while(j<n-1&&p!=NULL)
       {
           j++;
           p=p->next;
       }
       q=p->next;
       p->next=q->next;
       free(q);
    }
}
//释放链表
void freeList(LinkList &h)
{
    free(h);
}

int main()
{
    LinkList h;
    cout<<"欢迎进入单链表操作程序,本程序提供以下操作:"<<endl;
    cout<<endl;
    cout<<"1.初始化链表           2.插入n个元素           3.输出单链表"<<endl;
    cout<<"4.输出单链表的长度     5.输出链表的第n个元素   6.输出元素a的位置"<<endl;
    cout<<"7.判断链表是否为空     8.在第n个位置插入元素f  9.删除第n个元素"<<endl;
    cout<<endl;
    cout<<"输入数字1~8选择您的操作,输入0退出本系统!(为保证程序顺利运行,已默认执行初始化操作)"<<endl;
    cout<<"请输入数字:"<<endl;
    int op;
    Init(h);
    while(cin>>op&&op)
    {
        switch(op)
        {
        case 2:
            {
                int n;
                cout<<"输入n的值:";cin>>n;
                cout<<"输入插入的n个数的值:";
                InsertNum(h,n);
                cout<<"插入成功!"<<endl;
                break;
            }
        case 3:
            {
                cout<<"当前链表为:"; outputLinkList(h);
                cout<<endl;break;

            }
        case 4:
            {
                outputListLength(h);break;
            }
        case 5:
            {
                int n;
                cout<<"输入n的值:";cin>>n;
                outputNthNum(h,n);break;
            }
        case 6:
            {
                char a;
                cout<<"输入a的值:";cin>>a;
                outputNumPosition(h,a);break;
            }
        case 7:
            {
                Empty(h);break;
            }
        case 8:
            {
                int n;char f;
                cout<<"输入n的值: ";cin>>n;
                cout<<"输入f的值: ";cin>>f;
                InsertNumOnth(h,n,f);
                cout<<"插入成功!"<<endl;
                break;
            }
        case 9:
            {
                int n;
                cout<<"输入n的值: ";cin>>n;
                deleteNthNum(h,n);
                cout<<"删除成功!"<<endl;
                break;
            }
        }
    }
    return 0;
}


运行:

 

posted @ 2014-03-19 21:02  同学少年  阅读(714)  评论(0编辑  收藏  举报