单链表的创建、插入、删除

#include<iostream>
using namespace std;

typedef  int ElemType;
typedef struct LNode{
    ElemType data;
    int length ;
    struct LNode *next;
}LNode ,*LinkList;


void Print(LinkList &L)
{
    LinkList p = L->next;
    if(L->length == 0)
        cout<<"空表!"<<endl;
    else if(L->length == 1)
        cout<<(char)64<<"->"<<p->data<<endl;
    else{
        cout<<(char)64;
        for(int i = 1;i <= L->length ;++i){
            cout<<"->"<<p->data ;
            p = p->next;
        }
    }
    cout<<endl;
}

void PrintTitle()
{
    cout<<"**********单链表功能选择表************\n"<<endl;
    cout<<"1.创建单链表\t2.插入\t3.删除\t4.退出\n"<<endl;
    cout<<"**************************************\n";
    cout<<"输入你的选择: "<<endl;
}
void CreateList(LinkList &L,int n)
{
    //逆位序输入n个元素的值,建立带表头结点的单线性表L
    LinkList p;
    int i;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;//先建立一个带头结点的单链表
    cout<<"请输入"<<n<<"个将要创建的单链表元素:"<<endl;
    for(i = n;i > 0;--i){
        p = (LinkList)malloc(sizeof(LNode));//生成新结点
        cin>>p->data;
        p->next = L->next ;L->next = p;//插入到表头
    }
    L->length = n;
    cout<<"创建后的单链表为:"<<endl;
    Print(L);
    PrintTitle();
}

int ListInsert(LinkList &L,int i, ElemType e)
{
    //在带头结点的单链线性表L中第i个位置之前插入元素e
    if(i<0||i>L->length + 1)
        cout<<"插入越界!"<<endl;
    else{
        LinkList s,p = L;
        int j = 0;
        while(p&&j < i - 1){
            p = p->next ;
            ++j;  //寻找第i-1个结点
        }
        if(!p || j > i-1)return 0;
        s = (LinkList)malloc(sizeof(LNode));//生成新结点
        s->data = e;s->next = p->next;p->next = s; //插入L中
        ++L->length;
        cout<<"插入元素后的单链表为:"<<endl;
        Print(L);
    }
    PrintTitle();
    return 0;
}

int ListDelete(LinkList &L ,int i)
{
    //在带头结点的单链线性表L中删除第i个元素,并由e返回其值
    if(i<0||i>L->length)
        cout<<"删除越界!"<<endl;
    else{
        LinkList q,p = L;
        int j = 0;
        while(p->next && j < i-1){  //寻找第i个结点,并令p指向其前驱
            p = p->next;
            ++j;
        }
        if(!(p->next)||j>i-1)return 0;
        q = p->next;p->next = q->next ; //删除并释放结点
        //e = q->data ;
        free(q);
        --L->length ;
        cout<<"删除元素后的单链表为:"<<endl;
        Print(L);
    }
    PrintTitle();
    return 0;
}

int main()
{
    LinkList L = (LinkList)malloc(sizeof(LNode));
    L->length = 0;
    PrintTitle();
    int choice;
    while(1)
    {
        cin>>choice;
        if(choice == 4)
            return 0;
        switch(choice)
        {
        case 1:
            CreateList(L,10);break;
        case 2:
            {
                int i;
                int e;
                cout<<"输入插入的位置以及插入的元素"<<endl;
                cin>>i>>e;
                ListInsert(L,i,e);
                break;
            }
        case 3:
            {
                int i;
                cout<<"输入删除的位置"<<endl;
                cin>>i;
                ListDelete(L,i);
                break;
            }
        default:
            cout<<"make sure your choie between 1 to 4!"<<endl;
            break;
        }
    }
    getchar();
    return 0;
}

 

posted on 2013-10-28 14:16  南归  阅读(368)  评论(0)    收藏  举报