链表操作
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"); } }
以上是关于链表操作的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段15——git命令操作一个完整流程
VSCode自定义代码片段15——git命令操作一个完整流程
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段