本篇博客是在上一篇博客的基础上扩展的,希望读者在阅读完以下这个链接内容后再看这一篇
(9条消息) 教授先生带你学习链表:初识链表1_教授先生的博客-CSDN博客
描述:
给一串数字,用链表结构进行存储,然后给定针对该链表的若干删除 *** 作。要求将执行删除 *** 作后的结果输出。
输入要求:
第一行:输入一个整数n。表示这串数字有n个(n大于等于1)。
第二行:输入这n个整数。
第三行:输入一个整数m。表示需要执行m次删除 *** 作。(m<=n)
后面m行:每行输入一个整数a,表示要删除当前链表中的第a个数字。(假设链表中第一个节点的编号为1)。
输出要求:
执行了m次删除 *** 作中。输出剩下的n-m个数字。每个数字用空格空开。
输入样例:
3
2 1 3
2
1
1
输出样例
3
#include#include using namespace std; int m,n; struct node{ int data;//数据 node* next;//指向下一结点 }; void build(node* head) { node*p=head,*q; scanf("%d",&n); for(int i=1;i<=n;++i) { q=new node; scanf("%d",&q->data);//或者*(q).data q->next(*q).next p->next=q;//连接,每个head的next指针内容已经装下了下个节点的首地址 p=q; } p->next=NULL; } //删除的自定义函数 void del(node* head,int x)//传递的是参数head的地址,和第几个(x)后面的数字 { //从第一个节点开始寻找到要删除的节点前一个位置时就终止 for(int i=1;i next!=NULL)head=head->next;//将下一个head结构体的地址赋给head,可以理解为把节点相连接,连接起来就可以连续地使用它 //因为在创建链表时,每个head的next指针内容已经装下了下个节点的首地址 else return; //1,如果 head的next指针内容不是空,就将节点连接, //2,如果为空,则return 直接退出这个del函数,什么也不做(说明要删除的节点位置超出该链表的实际节点)删除失败,说明x位节点不存在 } if(head->next==NULL) return;//上面那个for循环是检测第1个到第x-1个的next是否为空 //从这个if开始判断第x个是否为空,1,若为空,直接退出del函数,上面也不做 ,说明x位节点不存在 head在x-1位置 head->next=head->next->next; //2,若不为空,则x位节点存在, //先看赋值号右边,计算完右边的数值再赋给左边, //先把右边的head->next->next 提取出来 ,从左边数 head->next表示的是第 x个节点的next指针(实际存储的是下一个节点的首地址), //head->next等价于 第(x+1)个结构体的首地址(自己理解一下) //然后 (head->next)->next 表示 第(x+1)个结构体的next指针(实际存储的是第(x+2)个结构体的首地址) //回到赋值号左边,将第(x+2)个结构体的首地址赋给next, //所以此处赋值号左边的 head->next 指的是将第x个 结构体的 结构体指针 指向 第(x+2)个结构体的首地址 //这样就实现了链表不与第(x+1)个结构体相连接的功能 } void show (node*head)//演示 { while(head->next!=NULL) { head=head->next; printf("%d",head->data); if(head->next==NULL)printf("n"); else printf(" "); } } int main(void) { node* head; // head=(node*)malloc(sizeof(node));// 如果是c语言就要写 #include 这个头文件写这句话,不要下面c++那个 head=new node;//c++,这个和上面那个是等价的,都是分配动态指针内存,这道题是c++,用new来分配动态指针内存 build(head); scanf("%d",&m); while(m--) { int x; scanf("%d",&x); del(head,x);//用这个删除的函数,传递参数 } show(head);//演示的函数 return 0; }
题目描述:
给定一串数字,用链表结构进行存储。然后给定针对该链表得若干插入 *** 作,要求将执行插入 *** 作后的结果输出。
输入要求:
第一行:输入一个整数n,表示这串数字有n个(n大于等于1)。
第二行:输入这n个整数。
第三行:输入一个整数m,表示需要执行m个插入 *** 作。
后面m行:每行输入两个整数a和b。表示在这串数字的当前第a个数字之后插入数字b。(假设链表第一个节点编号为1)
输出要求
输出 *** 作后的n+m个数字,每个数字用空格空开(最后一个数字后面没有空格,直接换行)
输入样例
3
2 1 3
2
1 5
1 6
输出样例
2 6 5 1 3
#include#include using namespace std; int a,b,n,m; struct node{ int data;//数据 node* next;//指向下一结点 }; void build(node* head) { node*p=head,*q; scanf("%d",&n); for(int i=1;i<=n;++i) { q=new node; scanf("%d",&q->data);//或者*(q).data q->next(*q).next p->next=q;//连接 p=q; } p->next=NULL; } //插入函数代码 void insert(node* head,int a,int b)//表示第a个插入位置插入b数字 { for(int i=1;i<=a;++i) {//从第一个结构体开始寻找到第a个结构体,如果head的next指针不为空,则 连接起来 if(head->next!=NULL)head=head->next; else return;//如果为空,说明选择要插入的位置大于这个链表的最大位置,则插入失败,退出函数 } node*p=new node;//定义一个新的结构体指针并为它分配内存空间 p->data=b; //把要输入的b数值赋给 这个新的结构体指针存储数据的部分区域,data //head在a位置 //不能交换顺序(下面这两行) p->next=head->next;//先看赋值号右边 head->next表示的是 下一个结构体的首地址 //将下个头文件首地址赋给 p这个插入的结构体的指针 (完成了p的尾部和第a+1个结构体的连接) head->next=p;//将第a个结构体的指针与p的首地址相互连接(完成了p的头部与第a个结构体的尾部连接) } void show (node*head) { while(head->next!=NULL) { head=head->next; printf("%d",head->data); if(head->next==NULL)printf("n"); else printf(" "); } } int main(void) { node* head; //head=(node*)malloc(sizeof(node));//c语言 #include head=new node;//c++ build(head); scanf("%d",&m); while(m--) { int x; scanf("%d%d",&a,&b); insert(head,a,b); } show(head); return 0; }
创作不易,感谢你的支持。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)