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