首页 > 试题广场 >

KiKi学结构体和指针

[编程题]KiKi学结构体和指针
  • 热度指数:9783 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
KiKi学习了结构体和指针,他了解了结构体类型可以定义包含多个不同类型成员,而指针本质是内存地址,是引用数据的另外一种方式。现在他想将多个输入的数据通过结构体和指针的方式连接在一起,形成一个单向链表,即:每个结点是结构体类型,包括整型数据成员(data)和结构体指针类型成员(next),每个结点的指针部分指向下一个输入的结点。具体建立过程如下:先输入n个整数,按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。输出删除后的单链表信息。


输入描述:
包括三行:
第一行输入数据个数n (3≤n≤100);

第二行依次输入n个整数,用空格分隔;

第三行输入欲删除数据m。



输出描述:
包括两行:

第一行输出完成删除后的单链表长度;

第二行依次输出完成删除后的单链表数据。


示例1

输入

5
1 2 2 3 4
2

输出

3
1 3 4
#include <iostream>
#include <vector>
class forward_list
{
public:
	forward_list()  { createHead(); }

	void createHead();//创建头节点

	void insert(int);//插入

	void erase(int);//删除指定元素

	void reverse_print();//打印元素


	~forward_list() { delete head; }
	
	int length = 0;
private:
	//节点结构
	typedef struct Node
	{
		Node(int v = 0) :value(v), next(NULL) {}
		int value;
		Node* next;
	};

	std::vector<int> temp;
	Node* head;//头结点

};

//创建头结点
void forward_list::createHead()
{
	head = new Node(0);
}

void forward_list::insert(int value)//插入
{
	//头插法
	Node* p = new Node(value);
	p->next = head->next;
	head->next = p;
	length--;
	//第二轮 head p q
	//此时p->next == nullptr
	//head->next = p
	//Node* q = new Node(value);
	//q->next = head->next;
	//head->next = q;

}


void forward_list::erase(int target)//删除指定元素
{
	Node* temp_ptr;
	temp_ptr = head->next;
	
	while (temp_ptr !=NULL)
	{
		if (temp_ptr->value != target)
		{
			temp.push_back(temp_ptr->value);
		}
		temp_ptr = temp_ptr->next;
	}


}



void forward_list::reverse_print()//打印元素
{
	std::cout << temp.size() << std::endl;
	for (std::vector<int>::reverse_iterator iter = temp.rbegin(); iter != temp.rend(); ++iter)
	{
		std::cout << *iter << " ";
	}
	std::cout << std::endl;
}



int main()
{
	int deleteNum;
	
	forward_list list;
	std::cin >> list.length;
	int temp_value;

	while (std::cin >> temp_value)
	{
		list.insert(temp_value);
		if (!list.length)
			break;
	}

	std::cin >> deleteNum;
	list.erase(deleteNum);
	list.reverse_print();
}

发表于 2020-07-27 09:05:45 回复(0)
用STL里面的list容器存储输入进去的数据,这是一个双向链表容器,然后在删除那定义了两个迭代器指针,就正好对照了类似数据结构中的链表删除方法。
#include<bits/stdc++.h>
using namespace std;
int main(){
    list<int> l;
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        int num; cin >> num;
        l.push_back(num);
    }
    int num; cin >> num;
    list<int>::iterator it = l.begin();
    list<int>::iterator p = l.begin();
    while(it != l.end()){
        if(*it == num){
            p = it;
            it++;
            l.erase(p);
            continue;
        }
        it++;
    }
    cout << l.size() << endl;
    for(auto i : l)
        cout << i << " ";
    cout << endl;
    return 0;
}

编辑于 2020-06-03 17:22:05 回复(0)
import java.util.ArrayList;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        //输入需要输入数字个总个数
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            list.add(sc.nextInt());
        }

        //输入删除的数字
        int m = sc.nextInt();
        //循环遍历集合中的数字
        for (int index = 0; index < list.size(); ) {
            if(m == list.get(index)){
                list.remove(list.get(index));
            //如果集合里面有和输入的数字相同就减去。集合索引不增加
            }else{
            //如果集合里面没有相同数字,不进行操作,增加索引值。
                index++;
            }
        }
        //打印输出删除后集合的长度
        System.out.println(list.size());
        //将集合转换为数组,用于遍历
        Object[] obj = list.toArray();
        for (int i = 0; i < obj.length; i++) {
            if(i != obj.length){
                System.out.print(obj[i]+" ");
            }else{
                System.out.print(obj[i]);
            }

        }
    }
}
编辑于 2020-07-06 09:53:36 回复(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;
}

发表于 2022-02-10 11:55:47 回复(0)
#include<stdio.h>
int main(){
    int n,a[100],m,i,k;
    scanf("%d",&n);
    k=n;
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&m);
    for(i=0;i<n;i++){
        if(a[i]==m)
            k--;
    }printf("%d\n",k);
    for(i=0;i<n;i++){
        if(a[i]!=m)
            printf("%d ",a[i]);
    }printf("\n");
}

发表于 2021-06-07 18:43:55 回复(2)
//手写单链表
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.parseInt(scanner.nextLine());
        Node head = null;
        Node tail = null;
        for (int i = 0; i < n; i++) {
            int data = scanner.nextInt();
            Node newNode = new Node(data);
            if (head == null) {
                head = tail = newNode;
            } else {
                tail = tail.next = newNode;
            }
        }
        int delete = scanner.nextInt();
        Node nodeP = head;
        Node nodeBefore = null;
        while (nodeP != null) {
            if (nodeP.data == delete) {
                if (nodeP == head) {
                    nodeP = head = head.next;
                } else {
                    nodeBefore.next = nodeP.next;
                    nodeP = nodeP.next;
                }
                n--;
            } else {
                nodeBefore = nodeP;
                nodeP=nodeP.next;
            }
        }
        System.out.println(n);
        for (Node node = head; node != null; node = node.next) {
            System.out.print(node.data + " ");

        }
    }
}

class Node {
    public int data;
    public Node next;

    public Node(int data) {
        this.data = data;
    }
}

发表于 2021-03-28 21:36:56 回复(0)
package com.kingwan.niuke;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

/**
 * Created by kingwan on 2020/10/9.
 * 说明:链表的迭代方式
 */
public class Main {
    static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        int n = scanner.nextInt();
        LinkedList<Integer> list = new LinkedList();
        //填充链表
        while (n>0){
            list.add(scanner.nextInt());
            n--;
        }
        int del = scanner.nextInt();
        //使用迭代器迭代--注意:链表不是数组,使用for循环会抛异常的
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            if(iterator.next()==del){
                iterator.remove();//符合条件的删除
            }
        }
        //按要求输出
        System.out.println(list.size());
        for (Integer integer : list) {
            if(integer!=del)
                System.out.print(integer+" ");
        }
    }
}

发表于 2020-10-09 19:17:41 回复(0)
#include<bits/stdc++.h>
using namespace std;

struct Node {
    int val;
    Node* next = nullptr;
    Node(int v)
        :val(v)
    {
    }
};

int main() {
    Node* root = new Node(0);
    int n, a;
    cin >> n;
    Node* p = root;
    for(int i=0;i<n;i++) {
        cin >> a;
        p->next = new Node(a);
        p = p->next;
    }
    int del;
    cin >> del;
    p = root;
    while(p->next!=nullptr) {
        if(p->next->val == del) {
            p->next = p->next->next;
            n--;
            continue;
        }
        p = p->next;
    }
    cout << n << endl;
    for(p=root->next;p;p=p->next)
        cout << p->val << ' ';
    return 0;
}

发表于 2020-07-21 11:30:31 回复(0)

                              JavaScript

readline();
var arr = readline().split(' ').map(Number);
var del = readline();
arr=arr.filter((item)=>{
    return item!=del;
    }
);
console.log(arr.length);
var result ='';
for(var i =0;i<arr.length;i++){
    result += arr[i]+' ';
}
console.log(result);


发表于 2020-06-22 10:02:37 回复(0)
class Node():
    def __init__(self):
        self.data = 0
        self.nextnode = None
    def inputdata(self,data):
        self.data = data
class singlelink():
    def __init__(self):
        self.head = None
    def appendnode(self,data):
        if self.head == None:
            newnode = Node()
            newnode.inputdata(data)
            self.head = newnode
        else:
            newnode = Node()
            newnode.inputdata(data)
            nownode = self.head
            while 1:
                if nownode.nextnode != None:
                    nownode = nownode.nextnode
                else:
                    break
            nownode.nextnode = newnode
    def length(self):
        nownode = self.head
        number = 0
        if self.head != None:
            number += 1
        else:
            return number
        while 1:
            if nownode.nextnode != None:
                nownode = nownode.nextnode
                number += 1
            else:
                break
        return number
    def remove(self,data):
        cur = self.head
        while cur:
            if cur.data == data:
                if cur == self.head:
                    self.head = cur.nextnode
                else:
                    before.nextnode = cur.nextnode
            if cur.data != data:
                before = cur
            cur = cur.nextnode
    def output(self):
        cur = self.head
        while cur:
            print(cur.data,end=' ')
            cur = cur.nextnode
int(input())
s = [int(x) for x in input().split()]
link = singlelink()
for i in s:
    link.appendnode(i)
link.remove(int(input()))
print(link.length())
link.output()
发表于 2020-05-20 10:42:38 回复(0)
#include <stdio.h>
#include <stdlib.h>

typedef struct linklist
{
    struct linklist *next;
    int data;
}LNode;

int main()
{
    LNode *L = (LNode *)malloc(sizeof(LNode)), *p, *pre;
    L->next = NULL;
    pre = L;
    int n, i;
    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &(p->data));
        pre->next = p ;
        p->next = NULL;
        pre = p       ;
    }
    int del, del_count = 0;
    scanf("%d", &del);
    p = L->next;pre = L;
    while(p)
    {
        if(p->data == del)
        {
            pre->next = p->next;
            free(p);
            p = pre->next;
            del_count++;
        }
        else
        {
            pre = p;
            p = p->next;
        }
    }
    printf("%d\n", n - del_count);
    p = L->next;
    printf("%d", p->data);
    p = p->next;
    while(p)
    {
        printf(" %d", p->data);
        p = p->next;
    }
    putchar(10);
    pre = L;p = L->next;
    while(p)
    {
        free(pre);
        pre = p;
        p = p->next;
    }
    free(pre);

    return 0;
}

编辑于 2020-04-12 21:52:37 回复(2)
#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;
}

编辑于 2024-02-04 18:09:25 回复(0)
#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;
}

发表于 2024-08-14 12:18:14 回复(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;
}
发表于 2024-07-20 18:58:09 回复(0)
#include <stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef struct Node
{
    int data;
    struct Node* next;

}Node;

typedef struct LinkList
{
    Node* first;
    Node* last;
    int size;

}LinkList;

void InitLinkList(LinkList* list)
{
    list->first=list->last=(Node*)malloc(sizeof(Node));
    assert(list->first!=NULL);
    list->size=0;
    list->first->next=NULL;
}

void CreateLinkList(LinkList* list,int n)
{
    int i;
    Node* p=list->first;
    for(i=0;i<n;i++)
    {
        Node* s=(Node*)malloc(sizeof(Node));
        assert(s!=NULL);
        s->data=0;
        s->next=NULL;
        p->next=s;
        p=p->next;
        list->last=s;
        list->size++;
    }
}

void AssignmentLinkList(LinkList* list,int arr[],int n)
{
    int i;
    Node* p=list->first->next;
    for(i=0;i<n;i++)
    {
        p->data=arr[i];
        p=p->next;
    }
}

void DeleteLinkList(LinkList* list,int del,int n)
{
    Node* p=list->first->next;
    Node* s=list->first;
    while(p!=NULL)
    {
        if(p->data==del)
        {
            s->next=p->next;
            free(p);
            p=s->next;
            list->size--;
        }
        else {
            s=s->next;
            p=p->next;
        }
    }  
}

void Show(LinkList* list)
{
    Node* p=list->first->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}

void Length(LinkList* list)
{
    printf("%d\n",list->size);
}

int main()
{
    int n,i;
    scanf("%d",&n);
    int arr[n];
    for(i=0;i<n;i++)
        scanf("%d",&arr[i]);
    int delete;
    scanf("%d",&delete);

    LinkList mylist;
    InitLinkList(&mylist);
    CreateLinkList(&mylist,n);
    AssignmentLinkList(&mylist,arr,n);
    DeleteLinkList(&mylist,delete,n);
    Length(&mylist);
    Show(&mylist);

    return 0;
}
发表于 2024-05-18 15:45:42 回复(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;
}

编辑于 2023-12-06 11:21:16 回复(0)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>


typedef struct list {
    int data;
    struct list* next;
} list;
list* find(list* phead, int x) {
    list* cur = phead->next;
    while (cur->data != x && cur != NULL) {
        cur = cur->next;
    }
    return cur;
}
list* get_newnode(int x) {
    list* newnode = (list*)malloc(sizeof(list));
    assert(newnode);
    newnode->data = x;
    newnode->next = NULL;

    return newnode;
}
void listPushBack(list* phead, int x) {
    list* newnode = get_newnode(x);
    assert(newnode);
    list* cur = phead;
    while (cur -> next != NULL) {
        cur = cur->next;
    }
    cur->next = newnode;
}
void listpop(list* phead, list* pos) {
    assert(phead);
    list* cur = phead->next;
    list* prev = phead;
    list* back = pos->next;
    while (cur != pos) {
        prev = cur;
        cur = cur->next;
    }
    prev->next = back;
    free(pos);
    pos = NULL;
}
void Print(list* phead) {
    list* cur = phead -> next;
    while (cur != NULL) {
        printf("%d ", cur->data);
        cur = cur->next;
    }
}
int main() {
    list* a = (list*)malloc(sizeof(list));
    assert(a);
    a->data = 0;
    a->next = NULL;

    int n = 0;
    scanf("%d", &n);
    int i = 0, tmp = 0;
    for (i = 0; i < n; i++) {
        scanf("%d", &tmp);
        listPushBack(a, tmp);
    }
    int x = 0;
    scanf("%d", &x);
    list* pos = find(a, x);
    while (pos != NULL) {
        listpop(a, pos);
        pos = find(a, x);
        n--;
    }
    printf("%d\n", n);
    Print(a);
    return 0;
}

发表于 2023-11-10 14:44:41 回复(0)
#include<stdio.h>
int main()
{
    int i = 0,number=0;
    int n = 0;
    scanf("%d", &n);
    int arr[20] = { 0 };
    for (i = 0; i < n; i++) {
            scanf("%d", &arr[i]);
    }
    scanf("%d", &number);
    /*for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[i + 1] < arr[i]) {
                int tmp = arr[i + 1];
                arr[i + 1] = arr[i];
                arr[i] = tmp;
            }
        }
    }*/
    int k = n;
    for (i = 0; i < k; i++) {
        if (arr[i] == number) {
            n--;
        }
    }printf("%d\n", n);
    for (int i = 0; i < k; i++) {
        if (arr[i] != number) {
            printf("%d ", arr[i]);
        }
    }
    return 0;
}
发表于 2023-11-01 09:18:49 回复(0)
import java.util.Scanner;

import java.util.LinkedList;

// 注意类名必须为 Main, 不要有任何 package xxx 信息

class LinkNode {
    public int val;
    public LinkNode next;
    public LinkNode (int val) {
        this.val = val;
    }
    public LinkNode(int val, LinkNode next) {
        this.val = val;
        this.next = next;
    }
}

class MyLinkedList {
    public LinkNode head;
    public LinkNode last;
    public Integer size = 0;
    public void addList(int val) {
        if (head == null) {
            this.head = new LinkNode(val);
            this.last = head;
            this.size = 1;
            return;
        } else {
            LinkNode cur = new LinkNode(val);
            this.last.next = cur;
            this.last = cur;
            this.size++;
        }
    }
    public void removeAll(int key) {
        if (this.head == null) return;
        LinkNode cur = this.head.next;
        LinkNode prev = this.head;

        while (cur != null) {
            if (cur.val == key) {
                prev.next = cur.next;
                this.size--;
            } else {
                prev = cur;
            }
            cur = cur.next;
        }
        if (this.head.val == key) {
            this.head = this.head.next;
            this.size--;
        }
    }
    public void display() {
        LinkNode cur = this.head;
        while (cur != null) {
            System.out.printf("%d ", cur.val);
            cur = cur.next;
        }
    }
}


public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n = in.nextInt();
        MyLinkedList list = new MyLinkedList();
        for (int i = 0; i < n; i++) {
            list.addList(in.nextInt());
        }
        list.removeAll(in.nextInt());
        System.out.println(list.size);

        list.display();
    }
}

发表于 2023-05-02 12:11:34 回复(0)
#include<stdio.h>
//链表节点
struct node
{
    int data;//数据域
    struct node*next;//指针域
};
int main()
{   struct node*tail=NULL;//指向链表尾部元素
    struct node*list=NULL;//指向链表的指针
    int n=0;
    scanf("%d",&n);
    int i=0;
    int m=0;
    int d=0;//要删除的元素
 //接收n个数字并尾插到链表中
    for(i=0;i<n;i++)
 {
    scanf("%d",&m);
    struct node*pn=(struct node*)malloc(sizeof(struct node));
    pn->data=m;
    pn->next=NULL;
    //插入第一个元素
    if(list==NULL)
    {list=pn;
     tail=pn;
    }
     else
     {
         tail->next=pn;
         tail=pn;
     }
 }
     scanf("%d",&d);
 //删除链表中指定的元素
    struct node*cur=list;
    struct node*prev=NULL;
    while(cur)
    {//找到了要删除的元素
     if(cur->data==d)
     {//删除
     //删除的如果是第一个节点
     struct node*pd=cur;
     if(cur==list)
     {
     list=list->next;
     cur=list;
     }else
     {
         prev->next=cur->next;
         cur=prev->next;
     }
     free(pd);
     n--;
     }
     else
     {
     prev=cur;    
     cur=cur->next;
     }
    }
     printf("%d\n",n);
     cur=list;
     //输出
     while(cur)
     {
     printf("%d ",cur->data);
     cur=cur->next;
     }
     //释放
     cur=list;
     struct node*del=NULL;
     while(cur)
     {
     del=cur;
     cur=cur->next;
     free(del);
     }
     list=NULL;
     return 0;
}
发表于 2023-03-13 20:27:14 回复(0)