之前总结过有关线性表的知识点了 https://www.cnblogs.com/gaodiyuanjin/p/18408773
现在回答那一句话了 来总结一些题目 我认为这几道题目很基础 掌握后
便可以偏概全的应对所有变形题目
顺序表(顺序存储):
| 1.从顺序表中删除具有最小值(最大值)的元素 空出的位置由最后一个元素填补 |
| 若顺序表为空 则显示错误 |
| bool Del_Min(SqList &L,Elemtype &e) |
| if(L.length==0) |
| return false; |
| e=L.data[0]; |
| int pos=0; |
| for(int i=1;i<L.length;i++) |
| if(L.data[i]<e){ |
| e=L.data[i]; |
| pos=i; |
| } |
| L.data[pos]=L.data[L.length-1]; |
| L.length--; |
| return true; |
| 2.设计一个算法 将顺序表L的所有元素逆置 |
| void Reverse(SqList &L,ElemType *start,ElemType* end){ |
| start=0 |
| end=L.length-1 |
| ElemType temp |
| while(start==end){ |
| temp=L.data[start] |
| L.data[start]=L.data[end] |
| L.data[end]=temp |
| start++ |
| end-- |
| } |
| } |
| 高效性: |
| void Reverse(SqList &L){ |
| |
| ElemType temp |
| for(int i=0 |
| temp=L.data[i] |
| L.data[i]=L.data[L.length-i-1] |
| L.data[L.length-i-1]=temp |
| } |
| } |
| 3.在第i个位置插入一个新元素e 其后元素向后移动一个位置 |
| bool ListInsert(SqList &L,int i,ElemType e){ |
| |
| if(i<1||i>L.length+1) |
| return false; |
| |
| if(L.length>=MaxSize) |
| return false; |
| for(int j=L.length;j>=i;j--) |
| L.data[j]=L.data[j-1]; |
| L.data[i-1]=e; |
| L.length++; |
| return true; |
| } |
| 4.将两个有序顺序表合并成一个新的有序顺序表 |
| bool Merge(SeqList A,SeqList B,SeqList &C){ |
| if(A.length+B.length>C.maxSize) |
| return false; |
| int i=0,j=0,k=0; |
| while(i<A.length&&j<B.length){ |
| if(A.data[i]<=B.data[j]) |
| C.data[k++]=A.data[i++]; |
| else |
| C.data[k++]=B.data[j++]; |
| } |
| |
| while(i<A.length) |
| C.data[k++]=A.data[i++]; |
| while(j<B.length) |
| C.data[k++]=B.data[j++]; |
| C.length=k; |
| return true; |
| } |
链表(链式存储):
(有头结点和无头结点)
| 1.求单链表表长度操作 |
| |
| int Length(LinkList L){ |
| int len=0; |
| LNode *p=L->next; |
| while (p!=NULL){ |
| p=p->next; |
| len++; |
| } |
| return len; |
| } |
| |
| int Length(LinkList L){ |
| int len=0; |
| LNode *p=L; |
| while (p->next!=NULL){ |
| p=p->next; |
| len++; |
| } |
| return len; |
| } |
| 2.在第i个位置插入一个值为e的新结点 |
| |
| bool ListInsert(linkList &L,int i,ElemType e){ |
| |
| 进行特殊处理 将头指针L指向新的首结点 |
| if (i == 1) { |
| LNode *s = (LNode *)malloc(sizeof(LNode)); |
| s->data = e; |
| s->next = L; |
| L = s; |
| return true; |
| } |
| LNode *p=L; |
| |
| int j=0; |
| while(p!=NULL&&j<i-1){ |
| p=p->next; |
| j++; |
| } |
| if(p==NULL) |
| return false; |
| LNode *s=(LNode*)malloc(sizeof(LNode)); |
| s->data=e; |
| s->next=p->next; |
| p->next=s; |
| return true; |
| } |
| 3.删除单链表第i个结点 |
| bool ListDelete(LinkList &L,int i,ElemType &e){ |
| |
| if (i == 1) { |
| LNode *q = L; |
| e = q->data; |
| L = L->next; |
| free(q); |
| return true; |
| } |
| LNode *p=L; |
| int j=0; |
| while(p!=NULL&&j<i-1){ |
| p=p->next; |
| j++; |
| } |
| if(p==NULL||p->next=NULL) |
| return false; |
| LNode *q=p->next; |
| e=q->data; |
| p->next=q->next; |
| free(q); |
| return true; |
| } |
| 4.(带头结点)删除单链表给定值为e(设唯一)的结点 |
| bool Delete(LinkList L, ElemType e) { |
| LNode *p = L; |
| //以p->next等于e为条件 找到了待删结点的前驱p |
| while (p->next != NULL && p->next->data != e) |
| p = p->next; |
| LNode *q = p->next; |
| p->next = q->next; |
| free(q); |
| return true; |
| } |
| 5.(带头结点)删除单链表L中一个最小值(最大值)结点的算法 |
| bool Delete(LinkList L){ |
| LNode *p = L; |
| LNode *tmep=L->next; |
| LNode *q=L; |
| while(p->next!=NULL){ |
| |
| if(temp->data > p->next->data){ |
| temp=p->next; |
| q=p; |
| } |
| p=p->next; |
| } |
| q->next=temp->next; |
| free(temp); |
| return true; |
| } |
| 6.(带头结点)删除单链表中所有值为e(不唯一)的结点 |
| bool Delete(LinkList L,ElemType e){ |
| |
| LNode *p = L->next,*pre=L,*q; |
| while(p!=NULL){ |
| if(p->data==e){ |
| q=p; |
| p=p->next; |
| pre->next=p; |
| free(q); |
| } else{ |
| |
| pre=p; |
| p=p->next; |
| } |
| } |
| return true; |
| } |
| 7.(带头结点)将单链表逆置的算法 |
| bool Reverse(LinkList L) { |
| if (L == NULL || L->next == NULL) { |
| return false; |
| } |
| LNode *prev = NULL; |
| LNode *p = L->next; |
| LNode *next = NULL; |
| while (p != NULL) { |
| next = p->next; |
| p->next = prev; |
| prev = p; |
| p = next; |
| } |
| L->next = prev; |
| return true; |
| } |
| 8.(带头结点)将单链表L2链接到L1的末尾 释放掉L2的头结点 |
| bool Merge(LinkList L1, LinkList L1) { |
| if (L2 == NULL) { |
| return false; |
| } |
| LNode *q = L2; |
| L2 = L2->next; |
| free(q); |
| LNode *p = L1; |
| while (p->next != NULL) |
| p = p->next; |
| p->next = L2; |
| return true; |
| } |
| 9.采用头插法建立单链表 |
| bool HeadInsert(LinkList L1) { |
| LNode *s; |
| int x; |
| L=(LNode*)malloc(siezof(LNode)); |
| L->next=NULL; |
| scanf("%d",&x); |
| while(x!=链表长度){ |
| s=(LNode*)malloc(siezof(LNode)); |
| s->data=x; |
| s->next=L->next; |
| L->next=s; |
| scanf("%d",&x); |
| } |
| return true; |
| } |
| 10.采用尾插法建立单链表 |
| bool TailInsert(LinkList L1) { |
| LNode *s, *r = L; |
| int x; |
| L = (LNode *) malloc(siezof(LNode)); |
| scanf("%d", &x); |
| while (x!=链表长度){ |
| s = (LNode *) malloc(siezof(LNode)); |
| s->data = x; |
| r->next = s; |
| r = s; |
| scanf("%d", &x); |
| } |
| r->next = NULL; |
| return true; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?