首页 > 试题广场 >

KiKi学结构体和指针

[编程题]KiKi学结构体和指针
  • 热度指数:9811 时间限制: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 <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>
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>

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<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;
}


发表于 2022-08-06 12:13:49 回复(0)
#include<stdio.h>
#include<stdlib.h>
typedef struct Slist
{
    int data;
    struct Slist* next;
}SL;
SL* BuyMem(int x)
{
    SL* newnode = (SL*)malloc(sizeof(SL));
    newnode->data = x;
    newnode->next = NULL;
    return newnode;
}
SL* InitSL(void)
{
    SL* phead = BuyMem(0);
    return phead;
}
void PushBack(SL* phead, int x)
{
    SL* tail = phead;
    while (tail->next)
    {
        tail = tail->next;
    }
    tail->next = BuyMem(x);
}
void Print(SL* phead,int n)
{
    SL* tail=phead->next;
    printf("%d\n",n);
    while (tail)
    {
        printf("%d ", tail->data);
        tail = tail->next;
    }
}
void PopSL(SL* phead,int x,int* n)
{
    SL* tail=phead->next;
    SL* src=phead;
    while(tail)
    {
      if(tail->data==x)
    {
          src->next=tail->next;
          tail=src->next;
          (*n)--;
    }
        else
        {
            tail=tail->next;
            src=src->next;
        }
    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    SL* plist;
    plist = InitSL();
    int k = 0;
    int i = 0;
    for (i = 0; i<n; i++)
    {
        scanf("%d", &k);
        PushBack(plist, k);
    }
    int m=0;
    scanf("%d",&m);
    PopSL(plist,m,&n);
    Print(plist,n);
    return 0;
}
发表于 2022-02-24 22:04:12 回复(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>
#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;
}

发表于 2022-01-08 22:39:13 回复(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;
    }
}

发表于 2022-01-04 01:53:39 回复(0)
#include<stdio.h>
#include<stdlib.h>
 typedef struct node
{
    int date;
    struct node *next;
}Node;
int main()
{
    struct node*head,*pre,*pt,*pr,*in;
    int n,m;
    
    head=(Node*)malloc(sizeof(Node));
    pre=head;
    scanf("%d",&n);
    
    
    int i,cnt=0;
    
    for(i=0;i<n;i++)
    {
        pt = (Node *)malloc(sizeof(Node));
        scanf("%d",&(pt->date));
        pre->next=pt;
        pre=pt;
    }
    pt->next=NULL;
    pr=head;
    scanf("%d",&m);
     i=0;
    pt=head->next;
    pre=head;
    while(pt)
    {
        if(pt->date==m)
        {
           pre->next=pt->next;
            free(pt);
            pt=pre->next;
            cnt++;
        }  
        else
        {
          pre=pt;
            pt=pt->next;
        }
    }
    printf("%d\n",n-cnt);
    pt=head->next;
    while(pt)
    {
        
      printf("%d ",pt->date);
        pt=pt->next;
    }
    return 0;
    
    
    
}
  
发表于 2021-11-16 20:06:50 回复(0)
#include <stdio.h>

int main(){
    int i,n,k,a[101]={0},j=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&k);
    for(i=0;i<n;i++)
    {
        if(a[i] != k)
            a[j++] = a[i];
    }
    printf("%d\n",j);
    for(i=0;i<j;i++)
        printf("%d ",a[i]);
    return 0;
}

发表于 2021-09-10 20:21:53 回复(0)
#include<stdio.h>
struct Node
{
    int data;  //数据域
    struct Node* next;     //指针域
    
    //链表结点的定义
};
int main()
{
    struct Node *list=NULL;
    struct Node* tail=NULL;
    //输入N;
    int n=0;
    int i=0,m=0;
    int d=0;
    scanf("%d",&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;
}
发表于 2021-07-22 09:53:07 回复(0)