单向链表的操作

来源:互联网 发布:linux redis 编辑:程序博客网 时间:2024/05/21 18:00
#include <iostream>using namespace std;typedef char ElemType;//定义char类型的ElemType,方便修改typedef struct LNode//定义一个结构体{    ElemType data;//链表数据区    LNode *next;//链表指针区}LinkList;void initList(LinkList * & L){    L=(LinkList *)malloc(sizeof(LinkList));//为链表开辟空间    L->next=NULL;//带头节点的顺序链表}void createList (LinkList * &L,ElemType a[],int n)//插入数据{    int i;    LinkList *p;    for(i=0;i<n;i++)//头插法 ,输出结果是逆序的    {        p=(LinkList *)malloc(sizeof(LinkList));        p->data=a[i];        p->next=L->next;        p->next=p;    }}int locateElem(LinkList *L,ElemType e)//查找元素{    LinkList *p=L->next;//第一个元素    int i=1;    while (p&&p->data!=e)//判断链表是否为空,然后查找链表里的元素    {        p=p->next;        i++;    }    if(!p)//查找完了,没找到    {        cout<<"没有这个元素!"<<endl;        return 0;    }    return i;}void listInsert(LinkList * &L,int i,ElemType e)//插入一个元素{    //[i>=1&&i<=size+1]    if(i<=0)    {        cout<<"无法插入!"<<endl;        return;    }    //1.检查i<=size+1   2.找到插入位置    int j=0;    LinkList *p=L,*q;    while (p&&j<i-1)//p不存在退出,j>=i-1退出    {        j++;        p=p->next;    }    if(!p)    {        cout<<"无法插入!"<<endl;        return;    }    q=(LinkList *)malloc(sizeof(LinkList));//开辟一个q链表    q->data=e;    q->next=p->next;    //插入节点 (p插入位置前面一个元素,q需要插入的元素)    p->next=q;    cout<<"插入完成!"<<endl;}void nixuList(LinkList *&L)//逆序{       LinkList *p,*t,*q;    if(L==NULL||L->next==NULL)    {        cout<<"无法逆序输出!"<<endl;        return;    }    p=L->next;    t=p->next;    p->next=NULL;       while(t)//    {        q=t->next;        t->next=L->next;        L->next=t;        t=q;    }}void  listDelete(LinkList * &L,int i)//删除一个元素(位置){    if(i<=0)    {        cout<<"无法删除!"<<endl;        return;    }    //1.检查i<=size+1   2.找到插入位置    int j=0;    LinkList *p=L,*q;    while (p&&j<i-1)//p不存在退出,j>=i-1退出    {        j++;        p=p->next;    }    if(!p)    {        cout<<"无法删除!"<<endl;        return;    }    else    {        //p要删除的元素的前一个        q=p->next;//要删除的对象        if(q==NULL)        {            cout<<"无法删除!"<<endl;            return;        }        p->next=q->next;        free(q);        cout<<"删除成功!"<<endl;    }}void dispList(LinkList*L){    if(L==NULL||L->next==NULL)    {        cout<<"链表为空!"<<endl;        return;    }    LinkList *p=L->next;    while (p)    {        printf("%c ",p->data);        p=p->next;    }    putchar('\n');}void destroyList (LinkList *&L)//销毁链表{    LinkList *p=L->next;//指向第一个元素    while (L->next)    {        L->next=p->next;        free(p);//释放原来第一个元素        p=L->next;//p指向第一个元素    }    //free(p);//要不要?    free(L);//释放head    L->next=NULL;    cout<<"销毁完成!"<<endl;}int main(int argc, const char * argv[]){    LinkList *p = nullptr;    int n,j;    printf("                  *******************\n");    printf("                  1.创建单链表        \n");    printf("                  2.查找单链表元素    \n");       printf("                  3.插入元素         \n");       printf("                  4.删除元素         \n");       printf("                  5.输出链表元素     \n");       printf("                  6.销毁单链表       \n");       printf("                  7.逆序输出       \n");       printf("                  8.退出             \n");       printf("                  *******************\n");       while(1)            {                printf("选择(1-8):");                scanf("%d",&n);                switch(n)                {                           case 1:                               ElemType elem_create,elem[50];                               printf("请输入元素(头插)(字符之间无空格):\n");                               getchar();                               j=0;                               while((elem_create=getchar())!='\n')                                        elem[j++]=elem_create;                               initList(p);                               createList(p,elem,j);                               printf("链表创建完成!\n\n");                               break;                           case 2:                               ElemType elem_search;                               printf("请输入要查找的元素:");                               getchar();                               elem_search=getchar();                               if(locateElem(p,elem_search))            //  if(locateElem(p,elem_search))                                        printf("要查找的元素是第%d个数据结点\n\n",locateElem(p,elem_search));                               else                                        printf("找不到元素%c\n\n",elem_search);                               break;                           case 3:                               int loc_insert;                               ElemType elem_insert;                               printf("输入插入位置和元素(逗号隔开):");                               scanf("%d,%c",&loc_insert,&elem_insert);                               listInsert(p,loc_insert,elem_insert);                               break;                           case 4:                               int loc_del;                               printf("输入删除位置:");                               scanf("%d",&loc_del);                               listDelete(p,loc_del);                               break;                           case 5:                               printf("链表元素有:\n");                               dispList(p);                               putchar('\n');                               break;                           case 6:                               destroyList(p);                               break;            case 7:                printf("逆序输出!\n");                nixuList(p);                break;                           case 8:                               return 0;                           default:                               printf("请输入正确的数字!\n\n");                       }            }   }

0 0
原创粉丝点击