链表操作

Posted OMG_By

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表操作相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<malloc.h>
//typedef int ElemType;
int k=1,f;
typedef struct LNode{
    int data;
    struct LNode *next;
}LinkList;
void InitList(LinkList *&L){   //创建头结点
    L=(LinkList *)malloc(sizeof(LinkList));
    L->next=NULL;
}
void DispList(LinkList *L){//输出线性表
    LinkList *p=L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int LocateElem(LinkList *L,int e){//按元素值查找
int i=1;
    LinkList *p=L->next;
    while(p!=NULL&&p->data!=e){
        p=p->next;
        i++;
        }
    if(p==NULL)
        return(0);
    else
        return(i);
}
bool ListInsert(LinkList * &L,int i,int e){//插入
    LinkList *p=L,*s,*q;
    q=p;
    p=p->next;
    while(p!=NULL){
        if(p->data==i){
            s=(LinkList *)malloc(sizeof(LinkList));
            s->data=e;
            s->next=p;
            q->next=s;
            return true;
        }
        q=p;
        p=p->next;
    }
    if(p==NULL && i==-1){
            s=(LinkList *)malloc(sizeof(LinkList));
            s->data=e;
            s->next=NULL;
            q->next=s;
            return true;
    }
     return false;
}
void DestroyList(LinkList *&L){//销毁
    LinkList *p=L,*q=p->next;
    while(q!=NULL){
        free(p);
        p=q;
        q=p->next;
    }
    free(p);
}
bool ListDelete(LinkList *&L,int e){//删除
//    int j=0;
    LinkList *p=L,*q;
    while(p!=NULL&&p->data!=e){
        q=p;
        p=p->next;
    }
    if(p==NULL)
        return false;
    else{
        q->next=p->next;
            free(p);
            return true;
    }
}
void ListHeBing(LinkList *&L1,LinkList *&L2){//合并
    LinkList *p=L2->next;
    while(p!=NULL){
        if(LocateElem(L1,p->data))
            p=p->next;
        else{
            ListInsert(L1,-1,p->data);
            p=p->next;
        }
    }
}
/*int main(){
    LinkList *h,*h1,*h2;
    int e;
    InitList(h);
    printf("ssda\n");
    ListInsert(h,-1,3);
    ListInsert(h,-1,9);
    ListInsert(h,-1,5);
    ListInsert(h,-1,6);
    ListInsert(h,-1,11);
    ListInsert(h,-1,8);
    printf("ssda\n");
    DispList(h);
    ListInsert(h,5,4);
    ListInsert(h,5,7);
    DispList(h);
    ListDelete(h,11);
    DispList(h);
    InitList(h1);
    ListInsert(h1,-1,1);
    ListInsert(h1,-1,2);
    ListInsert(h1,-1,4);
    ListInsert(h1,-1,9);
    ListInsert(h1,-1,10);
    ListInsert(h1,-1,18);
    ListHeBing(h,h1);
    DispList(h);
}*/
void CJList(LinkList *&L){
    printf("输入你要创建的链表按回车键结束:\n");
    int n;
    char c;
    while(scanf("%d%c",&n,&c)!=EOF&&c!=\n){
        ListInsert(*&L,-1,n);
    }
    ListInsert(*&L,-1,n);
    printf("以下是你创建的链表:\n");
    printf("h%d: ",k);
    DispList(*&L);
    return;
}
int main(){
   // LinkList *h1,*h2,*h3;
   LinkList *h[50];
    int e;
    int m,n;
    bool flag;
    printf("输入对应的序号进行操作:\n");
    printf("创建链表请扣1:\n");
    printf("插入数据请扣2:\n");
    printf("删除数据请扣3:\n");
    printf("合并链表请扣4:\n");
    printf("查看链表请扣5:\n");
    printf("销毁链表请扣6:\n");
    printf("退出请按0:\n");
    while(~scanf("%d",&e)){
        if(e==1){
            InitList(h[k]);
            CJList(h[k]);
            k++;
        }
        if(e==2){
            printf("你是要对第几条链表进行插入操作?请输入一个合理的数字!!\n");
            int y;
            scanf("%d",&y);
            printf("以下是你要插入的链表:\n");
            DispList(h[y]);
            printf("输入两个数,第一个数是你要插入的数值,第二个是要插入哪个数值的前面:\n");
            scanf("%d%d",&m,&n);
            flag=ListInsert(h[y],n,m);
            if(flag==true){
                printf("插入成功!!\n");
                printf("以下是你插入修改后的链表:\n");
                printf("h%d: ",y);
                DispList(h[y]);
            }
            else printf("插入失败!!\n");
        }
        if(e==3){
            printf("你是要对第几条链表进行删除操作?请输入一个合理的数字!!\n");
            int y;
            scanf("%d",&y);
            printf("以下是你要删除的链表:\n");
            DispList(h[y]);
            printf("输入你要删除的元素:\n");
            scanf("%d",&m);
            flag=ListDelete(h[y],m);
            if(flag==true){
                printf("删除成功!!\n");
                printf("以下是你删除后的链表:\n");
                printf("h%d: ",y);
                DispList(h[y]);
            }
            else printf("删除失败!!\n");
        }
   // DestroyList(h1);
        if(e==4){
                int m,n;
            printf("接下来进行链表合并:\n");
            printf("你要对哪两条链表进行合并?:\n");
            scanf("%d%d",&m,&n);
            printf("以下是你要合并的两条链表:\n");
             printf("h%d: ",m);
            DispList(h[m]);
             printf("\n");
              printf("h%d: ",n);
            DispList(h[n]);
            //InitList(h[k]);
          //  CJList(h[k]);
          //  f=k;
          //  k++;
           // InitList(h[k]);
           // CJList(h[k]);
            ListHeBing(h[m],h[n]);
            printf("以下是你合并后的链表:\n");
            printf("h%d: ",m);
            DispList(h[m]);
            k--;
        }
        if(e==5){
                printf("你要查看第几条链表?请输入一个合理的数字,如果要查看所有数组请输入-1:\n");
                int y;
                int i;
                scanf("%d",&y);
                if(y==-1){
                    for(i=1;i<k;i++){
                    printf("h%d: ",i);
                    DispList(h[i]);
                    }
                }
              else{
                printf("以下是你要查看的第%d条链表:\n",y);
                printf("h%d: ",y);
                DispList(h[y]);
              }
        }
        if(e==6){
            printf("你要销毁第几条链表?请输入一个合理的数字,如果要销毁所有数组请输入-1:\n");
                int y;
                int i;
                scanf("%d",&y);
                if(y==-1){
                    for(i=1;i<k;i++)
                        DestroyList(h[i]);
                }
                else{
                    DestroyList(h[y]);
                    for(i=y;i<k;i++){
                        h[i]=h[i+1];
                    k--;
                    }
                }
        }
        if(e==0) exit(0);
         printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n");
    printf("输入对应的序号进行操作:\n");
    printf("创建链表请扣1:\n");
    printf("插入数据请扣2:\n");
    printf("删除数据请扣3:\n");
    printf("合并链表请扣4:\n");
    printf("查看链表请扣5:\n");
    printf("销毁链表请扣6:\n");
    printf("退出请按0:\n");
    }
}

 

以上是关于链表操作的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript笔试题(js高级代码片段)

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

817. Linked List Components - LeetCode

一文讲透链表操作,看完你也能轻松写出正确的链表代码