本周写链表,不是很会写,借鉴了网上的一些代码,并加上自己的理解。
7-3 链表倒数n个结点的乘积
本题要求计算单链表倒数n个结点的乘积。例如,给出单链表1 2 3 4 5,则倒数2个结点的乘积为20。
输入格式:
输入有2行,第一个行为2个非负整数m和n。其中m为链表结点个数,n为链表倒数结点的数量。题目保证计算结果在int范围内。 第二行为链表的m个数,以空格分隔。
输出格式:
在一行中输出倒数n个结点的乘积。
输入样例:
5 2
1 2 3 4 5
结尾无空行
输出样例:
20
结尾无空行
样例解释:
20 = 4 * 5
思路:创建一个链表存进输入的数,再通过循环历遍,找到开始计算的节点,开始向后计算。
#include <stdio.h>
#include <stdlib.h>
typedef struct link{
int data;
struct link* next;
}link;
link* intlink(int n);
link *intlink(int n)//建立链表存数的函数
{
int a;
link* head=NULL;
link* p=(link*)malloc (sizeof(link));
p->data=1;
p->next=NULL;
head=p;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
link *b=(link*)malloc (sizeof(link));
b->data=a;
b->next=NULL;
p->next=b;
p=p->next;
}
return head;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
link*p=NULL;
p = intlink(n);
int sum=1;
if(n==0||m==0)//节点为0,返回0;
{
printf("0");
return 0;
}
p=p->next;
for(int i=0;i<n;i++)//循环历遍
{
if(i>n-m-1)//找到节点
{
sum*=p->data;
//printf("%d\n",p->data);
}
p=p->next;
}
printf("%d\n",sum);
return 0;
}
7-5 单向链表的创建与输出
本题目要求补充两个函数,实现如下功能:
输入若干个正整数,以-1结束,采取向链表中添加节点的方式来建立一个单链表,并输出这个单链表。
向链表尾部添加节点函数:
Link AppendNode(Link head,int data);
其中Link结构定义如下:
typedef struct link
{
int data;
struct link *next;
}*Link;
head:链表头指针,如果head为NULL,则会新建头节点data:要添加的节点数据值函数返回值:添加节点后的链表头指针
输出链表函数:
void DisplyNode(Link head);
head:链表头指针
主函数样例:
#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
int data;
struct link *next;
}*Link;
Link AppendNode(Link head,int data);
void DisplyNode(Link head);
int main()
{
int data;
Link head = NULL;
while (1)
{
scanf("%d",&data);
if (data==-1)
break;
head = AppendNode(head,data);
}
DisplyNode(head);
return 0;
}
/*在此实现 AppendNode函数 */
/*在此实现DisplyNode函数 */
输入格式:
从键盘输入若干个正整数(空格分隔),以-1结束。
输出格式:
依次输出单链表中各个节点的数据元素值,元素间以逗号分隔。如果链表为空,则输出NULL。参看输出样例。
输入样例:
1 3 5 7 9 -1
结尾无空行
输出样例:
1,3,5,7,9
结尾无空行
输入样例:
-1
结尾无空行
输出样例:
NULL
结尾无空行
本题用函数不会写,就直接写入主函数了,就是链表的建立与输出。
#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
int data;
struct link *next;
}Link;
Link *AppendNode(Link *head,int data);
void DisplyNode(Link *head);
int main()
{
int data;
Link *head;
Link *s=(Link*)malloc(sizeof(Link));
s->data=1;
s->next=NULL;
head=s;
int n=0;
while (1)
{
scanf("%d",&data);
if (data==-1)
break;
Link *p=(Link*)malloc(sizeof(Link));//链表的存储
p->data=data;
p->next=NULL;
s->next=p;
s=s->next;
n++;
//head = AppendNode(head,data);
}
//DisplyNode(head);
int d=0;
if(n==1)//n=1时的输出
{
printf("%d",head->next->data);
return 0;
}
head=head->next;//跳过设定的头节点
if(head==NULL)
{
printf("NULL");
return 0;
}
while(head!=NULL)//输出
{
if(d==0)//控制输出格式
{
printf("%d",head->data);
d=1;
head=head->next;
}
if(d==1)
{
printf(",%d",head->data);
}
head=head->next;
}
return 0;
}
/*Link *q;
Link *AppendNode(Link *head,int data)
{
Link *s=(Link*)malloc(sizeof(Link));
s->next=NULL;
q=s;
Link *p=(Link*)malloc(sizeof(Link));
p->data=data;
p->next=NULL;
s->next=p;
s=s->next;
return q;
}
void DisplyNode(Link *head)
{
int d=0;
head=head->next;
if(h==NULL)
{
printf("NULL");
return;
}
while(head!=NULL)
{
if(d==0)
{
printf("%d",head->data);
d=1;
head=head->next;
}
if(d==1)
{
printf(",%d",head->data);
}
head=head->next;
}
}*/
7-7 链表的逆置
输入若干个不超过100的整数,建立单链表,然后将链表中所有结点的链接方向逆置,要求仍利用原表的存储空间。输出逆置后的单链表。
输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据在一行上输入数据个数n及n个不超过100的整数。
输出格式:
对于每组测试,输出逆置后的单链表,每两个数据之间留一个空格。
输入样例:
1
11 55 50 45 40 35 30 25 20 15 10 5
输出样例:
5 10 15 20 25 30 35 40 45 50 55
思路:首先创建一个顺序链表,在创建一个倒置函数,最后顺序输出。
#include <stdio.h>
#include <stdlib.h>
typedef struct link{
int data;
struct link *next;
}link;
link reverse(struct link *ls)//倒置函数
{
if(ls->next==NULL)//判断是否要倒置
return;
if(ls->next->next==NULL)
return;
struct link *last=ls->next;//尾节点
struct link *pre=ls->next;//前一个结点
struct link *cur=ls->next;//当前节点
struct link *new=NULL;//下一个节点
while(cur)//完成倒置
{
new=cur->next;//下一个节点是当前的下一个
cur->next=pre;//当前的下一个节点是前一个
pre=cur;//前一个有等于当前
cur=new;//当前等于下一个
}
ls->next=pre;
last->next=NULL;
}
int main()
{
int t,a,n;
scanf("%d",&t);
while(t--)
{
int d=0;
struct link* head;
struct link* s;
s=NULL;
head=NULL;
struct link *p=(link*)malloc (sizeof(link));
head=p;
scanf("%d",&n);
while(n--)
{
scanf("%d",&a);
link *b=(link*)malloc (sizeof(link));
b->data=a;
b->next=NULL;
p->next=b;
p=p->next;
d++;
}
reverse(head);
s=head->next;
while(s!=NULL)
{
printf("%d",s->data);
s=s->next;
if(s!=NULL)
printf(" ");
}
printf("\n");
}
return 0;
}
7-10 顺序表(删除)
已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素
输入格式:
输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素,第三行是区间x和y。
输出格式:
删除元素值在[x,y]之间的所有元素后,输出新的顺序表。(最后无空格)
输入样例:
在这里给出一组输入。例如:
10
55 11 9 15 67 12 18 33 6 22
10 20
结尾无空行
输出样例:
在这里给出相应的输出。例如:
55 9 67 33 6 22
结尾无空行
思路:这道题相对简单,就是对每个节点的值进行判断,符合就就输出,不符合下一个。
#include <stdio.h>
#include <stdlib.h>
typedef struct link{
int data;
struct link *next;
}link;
int main()
{
int n;
scanf("%d",&n);
struct link *head=(link*)malloc(sizeof(link));
struct link *s=(link*)malloc(sizeof(link));
head=NULL;
head=s;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
struct link *p=(link*)malloc(sizeof(link));
p->data=x;
p->next=NULL;
s->next=p;
s=s->next;
}
int a,b;
scanf("%d%d",&a,&b);
head=head->next;
int d=0;
while(head!=NULL)
{
if(d==0)
{
if(head->data<a||head->data>b)
{
printf("%d",head->data);
d=1;
head=head->next;
}
}
if(d==1)
{
if(head->data<a||head->data>b)
{
printf(" %d",head->data);
}
}
head=head->next;
}
return 0;
}
本文介绍了几种链表的基本操作,包括计算链表倒数第N个节点的乘积、链表的创建与输出、链表的逆置以及顺序表中删除特定范围内的元素等。这些操作都是通过具体的代码实现来讲解的。
231

被折叠的 条评论
为什么被折叠?



