赞
踩
链表是在物理上(内存空间)非连续,非顺序的一种数据结构
结构体
和指针
来实现链表(linkNode)结构的。
接下来,通过一个题目(涉及到链表的全部基础操作),来学习链表的基础操作!
题目描述:
输入文件的第一行有两个整数n,q,分别表示初始链表中元素个数和对链表操作的次数,第二行有n个整数,表示初始链表的元素,保证这些数字不超过int表示的取值范围。接下来q行,每行可能为如下两个操作之一:
1 a b表示在第a个元素后面插入值为b的元素,
2 a表示将链表中第a个元素删除,如果a大于当时链表长度,则忽略此操作
输入说明
输入第一行是2个整数数字,表示n和q;第二行是n个整数,其间用一个半角空格间隔;接下来有q行数字,以1开头表示插入操作,以2开头表示删除操作。
输出说明
输出有1行,表示操作后的链表的所有结点的数据,数字间用一个半角空格间隔。若链表为空,输出"空"。
输入样例
3 3
1 2 3
1 1 4
1 2 5
2 2
输出样例
1 5 2 3
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}NODE;
int main()
{
int num_node = 0, num_oprt = 0;
scanf("%d %d", &num_node, &num_oprt);
NODE* head = create_linklist(num_node);//创建链表
for (int i = 0; i < num_oprt; i++)
{
int way_oprt = 0;
scanf("%d", &way_oprt);
switch (way_oprt)
{
case 1:
{
int pos = 0;
int data = 0;
scanf("%d %d", &pos, &data);
if (pos > num_node) {
break;
}
else {
head = insert_node(head, pos, data);
}
break;
}
case 2:
{
int pos = 0;
scanf("%d", &pos);
if (pos > num_node)
{
break;
}
else
{
delete_node(head, pos);
}
break;
}
}
}
if (head == NULL)
printf("空");
else
print_linklist(head);
return 0;
}
struct node* create_linklist(int n)//创建n个结点的链表,返回表头
{
NODE *head = NULL, * q = NULL, * p = NULL;
for (int i = 0; i < n; i++)
{
p = (NODE*)malloc(sizeof(NODE));
scanf("%d", &p->data);
if (i == 0)
{
head = p;
}
else
{
q->next = p;
}
q = p;
}
p->next = NULL;
return head;
}
struct node* insert_node(struct node* head, int pos, int data)//在以head为头的链表中第post的位置插入数据data,返回表头
{
NODE* p = head, * q = head;
NODE* new_node = (NODE*)malloc(sizeof(NODE));
new_node->data = data;
for (int i = 1; i <= pos; i++)//循环结束后q指向的是第pos个,p指向的是第pos个的后一个
{
q = p;
p = p->next;
}
if (p == NULL)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
q->next = new_node;
new_node->next = p;
}
return head;
}
struct node* delete_node(struct node* head, int pos)//在以head为头的链表中删除第post的位置的结点,返回表头
{
NODE* q = head, * p = head;
if (pos == 1)
return head->next;
for (int i = 2; i <= pos; i++)//这里要稍微注意一下:使循环结束后,q指向的是第pos个前,p指向的是第pos个
{
q = p;
p = p->next;
}
if (p == NULL)
{
q->next = NULL;
}
else
{
q->next = p->next;
free(p);
}
return head;
}
void print_linklist(struct node* head)//输出以head为头的链表的所有结点数据
{
NODE* p = head;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}NODE;
struct node* create_linklist(int n)//创建n个结点的链表,返回表头
{
NODE *head = NULL, * q = NULL, * p = NULL;
for (int i = 0; i < n; i++)
{
p = (NODE*)malloc(sizeof(NODE));
scanf("%d", &p->data);
if (i == 0)
{
head = p;
}
else
{
q->next = p;
}
q = p;
}
p->next = NULL;
return head;
}
struct node* insert_node(struct node* head, int pos, int data)//在以head为头的链表中第post的位置插入数据data,返回表头
{
NODE* p = head, * q = head;
NODE* new_node = (NODE*)malloc(sizeof(NODE));
new_node->data = data;
for (int i = 1; i <= pos; i++)//循环结束后q指向的是第pos个,p指向的是第pos个的后一个
{
q = p;
p = p->next;
}
if (p == NULL)
{
p->next = new_node;
new_node->next = NULL;
}
else
{
q->next = new_node;
new_node->next = p;
}
return head;
}
struct node* delete_node(struct node* head, int pos)//在以head为头的链表中删除第post的位置的结点,返回表头
{
NODE* q = head, * p = head;
if (pos == 1)
return head->next;
for (int i = 2; i <= pos; i++)//这里要稍微注意一下:使循环结束后,q指向的是第pos个前,p指向的是第pos个
{
q = p;
p = p->next;
}
if (p == NULL)
{
q->next = NULL;
}
else
{
q->next = p->next;
free(p);
}
return head;
}
void print_linklist(struct node* head)//输出以head为头的链表的所有结点数据
{
NODE* p = head;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
}
int main()
{
int num_node = 0, num_oprt = 0;
scanf("%d %d", &num_node, &num_oprt);
NODE* head = create_linklist(num_node);//创建链表
for (int i = 0; i < num_oprt; i++)
{
int way_oprt = 0;
scanf("%d", &way_oprt);
switch (way_oprt)
{
case 1:
{
int pos = 0;
int data = 0;
scanf("%d %d", &pos, &data);
if (pos > num_node) {
break;
}
else {
head = insert_node(head, pos, data);
}
break;
}
case 2:
{
int pos = 0;
scanf("%d", &pos);
if (pos > num_node)
{
break;
}
else
{
delete_node(head, pos);
}
break;
}
}
}
if (head == NULL)
printf("空");
else
print_linklist(head);
return 0;
}
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/636531
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。