输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。分别输出建立的初始单链表和完成删除后的单链表,以及链表的长度。
函数接口定义:
struct node* create(int n);
顺序建立一个带头结点的单链表。其中,n 为读入数据的数目。函数须返回单链表的头节点。
void delete(struct node *h,int x);
从单链表删除结点。其中,h 为单链表的头节点,x为删除结点的值。函数不需返回。
void print(struct node* h);
输出链表。其中,h 为单链表的头节点。函数不需返回。
裁判测试程序样例:
▾
▾
在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
#include<stdlib.h>
struct node{
int data;
struct node *next;
};
int n,m;
struct node* create(int n);
void delete(struct node *h,int x);
void print(struct node* h);
int main(){
struct node *h;
scanf("%d",&n);
h=create(n);
scanf("%d",&m);
printf("%d\n",n);
print(h);
delete(h,m);
printf("%d\n",n);
print(h);
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。
第一行是输入数据的数目;
第二行是建立链表的输入数据;
第三行是删除结点的值。
例如:
10
56 25 12 33 66 54 7 12 33 12
12
输出样例:
在这里给出相应的输出。
第一行输出建立链表后的链表长度;
第二行输出初始单链表;
第三行输出完成删除后的链表长度;
第四行输出完成删除后的单链表;
例如:
10
56 25 12 33 66 54 7 12 33 12
7
56 25 33 66 54 7 33
答案:
struct node* create(int n){
struct node *head,*tail,*p;
head=(struct node *)malloc(sizeof(struct node));
head->next =NULL;
tail =head;
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
p=(struct node*)malloc(sizeof(struct node));
p->data=x;
p->next=NULL;
tail->next=p;
tail=p;
}
return head;
}
void delete(struct node *h,int x){
struct node *head,*tail,*p;
head=h;
p=head->next;
tail=head;
while(p!=NULL){
if(p->data==x){
tail->next=p->next;
free(p);
p=tail->next;
n--;
}
else{
tail=p;
p=p->next;
}
}
}
void print(struct node* h){
static int count = 0; // 静态变量,记录调用次数
count++;
struct node *head,*tail,*p;
head=h;
p=head->next;
while(p!=NULL){
printf("%d",p->data);
if(p->next!=NULL){
printf(" ");
}
p=p->next;
}
if(count==1){
printf("\n");
}
}