KiKi学习了结构体和指针,他了解了结构体类型可以定义包含多个不同类型成员,而指针本质是内存地址,是引用数据的另外一种方式。现在他想将多个输入的数据通过结构体和指针的方式连接在一起,形成一个单向链表,即:每个结点是结构体类型,包括整型数据成员(data)和结构体指针类型成员(next),每个结点的指针部分指向下一个输入的结点。具体建立过程如下:先输入n个整数,按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。输出删除后的单链表信息。
包括三行:第一行输入数据个数n (3≤n≤100);第二行依次输入n个整数,用空格分隔;
第三行输入欲删除数据m。
包括两行:第一行输出完成删除后的单链表长度;
第二行依次输出完成删除后的单链表数据。
5 1 2 2 3 4 2
3 1 3 4
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} node;
node* CreateNode(int x) {
node* tmp = (node*)malloc(sizeof(node));
tmp->data = x;
tmp->next = NULL;
return tmp;
}
int main() {
int n, m, i;
scanf("%d", &n);
node* list = NULL, *tail = NULL;
while (n--) {
scanf("%d", &i);
node* cur = CreateNode(i);
if (list == NULL) {
list = cur;
tail = list;
} else {
tail->next = cur;
tail = tail->next;
}
}
scanf("%d", &m);
node* head = list;
node* prev = NULL;
int num = 0;
while (list) {
if (list->data == m) {
node* tmp = list;
if (prev != NULL) {
prev->next = list->next;
}
else {
head = list->next;
}
list = list->next;
free(tmp);
} else {
prev = list;
list = list->next;
num++;
}
}
list = head;
printf("%d\n", num);
while (list) {
printf("%d ", list->data);
list = list->next;
}
return 0;
} #include <stdio.h>
#include <stdlib.h>
typedef int SLDataType;
//创建结构体
typedef struct Node
{
SLDataType data;
struct Node *next;
}Node;
//初始化链表,返回头节点指针
Node* init_link_list()
{
Node* head = (Node*) malloc(sizeof(Node));
//初始化头节点指针指向NULL
head->next = NULL;
return head;
}
//在链表末尾插入节点
void insert_node(Node* head,int data)
{
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
Node* p = head;
while (p->next != NULL)
{
p = p->next;
}
p->next = newNode;
}
// 删除链表中所有值为target的节点
void delete_node(Node* head,int target)
{
Node* prev = head;
Node* cur = head->next;
while(cur != NULL)
{
if(cur->data == target)
{
prev->next = cur->next;
free(cur);
cur = prev->next;
}
else
{
prev = cur;
cur = cur->next;
}
}
}
//打印链表
void print_link_list(Node* head)
{
Node* p = head->next; //跳过头节点head
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//释放链表空间
void free_link_list(Node* head)
{
Node* p = head;
while(p != NULL)
{
Node* tmp = p;
p = p->next;
free(tmp);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
// 初始化链表
Node *head = init_link_list();
// 输入数据建立链表
for (int i = 0; i < n; ++i)
{
SLDataType data;
scanf("%d", &data);
insert_node(head, data);
}
// 输入要删除的数据m
int m = 0;
scanf("%d", &m);
// 删除链表中所有值为m的节点
delete_node(head, m);
// 计算删除后的链表长度并输出
int length = 0;
Node *p = head->next; // 跳过头结点
while (p != NULL)
{
length++;
p = p->next;
}
printf("%d\n", length);
// 输出删除数据后的链表
print_link_list(head);
// 释放链表空间
free_link_list(head);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
int main() {
int n = 0;
struct Node* list = NULL;
struct Node* tail = NULL;
//输入结点
int i = 0;
scanf("%d", &n);
for (i = 0; i < n; i++) {
int data = 0;
scanf("%d", &data);
struct Node* n = (struct Node*)malloc(sizeof(struct Node));
n->data = data;
n->next = NULL;
if (list == NULL) {
list = n;
tail = list;
} else {
tail->next = n;
tail = tail->next;
}
}
//删除结点
int del = 0;
scanf("%d", &del);
struct Node* cur = list;
struct Node* prev = NULL;
while (cur) {
if (cur->data == del) {
struct Node* pd = cur;
//如果删除的是第一个结点
if (cur == list) {
list = list->next;
cur = list;
} else {
//删除的不是第一个结点
prev->next = cur->next;
cur = prev->next;
}
n--;
free(pd);
} else { //找不到
prev = cur;
cur = cur->next;
}
}
cur = list;
printf("%d\n", n);
while (cur) {
printf("%d ", cur->data);
cur = cur->next;
}
//释放空间
cur = list;
while (cur) {
del = cur;
cur = cur->next;
free(del);
}
return 0;
} #include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int arr[100];
int i=0;
for(i=0;i<n;i++)
{
scanf("%d ",&arr[i]);
}
int k=0;
scanf("%d",&k);
int count=0;
for(i=0;i<n;i++)
{
if(arr[i]!=k)
{
count++;
}
}
printf("%d\n",count);
for(i=0;i<n;i++)
{
if(arr[i]!=k)
{
printf("%d ",arr[i]);
}
}
return 0;
} #include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node* next;
}node;
void insertnode(node* head, int x)//插入元素
{
node* n1 = (node*)malloc(sizeof(node));
n1->data = x;
n1->next = NULL;
node* p = head, *q = p;
while (p->next != NULL)
{
p = p->next;
}
p->next = n1;
}
void deletenode(node* head, int e)//删除元素
{
node* p = head;
node* q = p;
while (p->next != NULL)
{
q = p;
p = p->next;
if (p->data == e)
{
q->next = p->next;
free(p);
p = q;
}
}
}
int countnode(node* head)//统计个数
{
node* p = head;
int count = 0;
while (p->next)
{
p = p->next;
count++;
}
return count;
}
void showlist(node* head)//打印链表
{
node* p = head->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
}
int main()
{
int n;
scanf("%d", &n);
node* head = (node*)malloc(sizeof(node));
head->next = NULL;
for (int i = 0; i < n; ++i)
{
int x;
scanf("%d", &x);
insertnode(head, x);
}
//showlist(head);
int e;
scanf("%d", &e);
deletenode(head, e);
//printf("\n");
printf("%d\n", countnode(head));
showlist(head);
free(head);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
//创建节点
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
int main(void)
{
ElemType i,n,k,m,t;
LinkList p,r,L,q,s;
//创建指定长度的链表
scanf("%d",&n);
t=n;
L=(LinkList)malloc(sizeof(Node));
r=L;
for(i=0;i<n;i++)
{
scanf("%d",&k);
p=(LinkList)malloc(sizeof(Node));
p->data=k;
r->next=p;
r=p;
}
r->next=NULL;
scanf("%d",&m);
//删除指定元素
s=L;
q=L->next;
while(q)
{
if(q->data==m)
{
s->next=q->next;
free(q);
q=s->next;
--t;
}
else{
s=s->next;
q=q->next;
}
}
p=L->next;
//遍历输出
printf("%d\n",t);
for(i=0;i<t;i++)
{
printf("%d ",p->data);
p=p->next;
}
return 0;
} #include<stdio.h>
#include<stdlib.h>
struct Node
{
int date;//date是一个整形
struct Node* next;//next存的是地址
};
int main()
{
int n = 0;
scanf("%d", &n);
struct Node *list= NULL;//设置结点
struct Node* tail = NULL;//tail尾巴意思是存地址域
for (int i = 0; i < n; i++)
{
int date = 0;
scanf("%d", &date);//数值域
struct Node* p = (struct Node*)malloc(sizeof(struct Node));//申请动态空间,意思是一个地址域一个数值域
p->date = date;
p->next = NULL;//地址域为空方便后面的存
if (list == NULL)//存第一个数的地址
{
list = p;//list存的是地址
tail =p;//tail的作用其实是地址域
}
else
{
tail->next = p;//这里的tail还是上一个结点,所以他存这一个结点的地址
tail = p;//换成下一个结点
}
}
int a = 0;
scanf("%d", &a);
struct Node* cur = list;
struct Node* find = NULL;//cur后面的指针
while (cur)
{
if (cur->date == a)
{
struct Node* np = cur;//不清楚
if (cur == list)
{
list = list->next;//假如第一个就是要删去的数,那么指针直接跳过他,意思就是直接删除
cur = list;//cur找下一个结点
}
else
{
find->next = cur->next;//跳过要删去的结点,直接跳到下一个结点的地址域
cur = find->next;//cur找下一个结点
}
free(np);
n--;
}
else
{
find = cur;//find成为上一个结点
cur = cur->next;//cur找下一个结点
}
}
printf("%d\n", n);
//显示数列;
cur=list;
while (cur)//直到cur=NULL停止
{
printf("%d ", cur->date);//date为数值域
cur = cur->next;//直接下一个结点;
}
//释放
cur = list;
struct Node* del = NULL;
while (cur)
{
del = cur;
cur = cur->next;
free(del);
}
return 0;
} #include <stdio.h>
typedef struct node
{
int data;
struct node *next;
}Node;
void Creat(Node **head, int Legth);
int NodeLength(Node *head);
Node *Delete(Node *head, int da);
void printNode(Node *head);
int main()
{
Node *head = NULL;
int n = 0;
scanf("%d", &n);
Creat(&head, n);
int m = 0;
scanf("%d", &m);
head = Delete(head, m);
printf("%d\n", NodeLength(head));
printNode(head);
}
void Creat(Node **head, int Legth)
{
Node *tail = NULL;
for(int i = 0; i < Legth; i++)
{
Node *tmp = (Node *)malloc(sizeof(Node));
if(tmp != NULL)
{
scanf("%d ", &(tmp->data));
tmp->next = NULL;
if(*head == NULL)
*head = tmp;
else
tail->next = tmp;
tail = tmp;
}
}
}
int NodeLength(Node *head)
{
Node *tmp = head;
int cut = 0;
while(tmp)
{
tmp = tmp->next;
cut++;
}
return cut;
}
Node *Delete(Node *head, int da)
{
Node *pre = head;
Node *tail = head;
while(tail)
{
if(tail->data == da)
{
Node *pd = tail;
if(tail == head)
{
tail = tail->next;
head = head->next;
}
else
{
pre->next = tail->next;
tail = pre->next;
}
free(pd);
}
else
{
pre = tail;
tail = pre->next;
}
}
return head;
}
void printNode(Node *head)
{
while(head)
{
printf("%d ", head->data);
head = head->next;
}
}