给定一个存储了若干个整数(个数范围:0 - 1000)的单向链表和一个整数 v,删除单向链表中所有值为 v 的节点。
输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
对于每个问题,有 3 行数据:第 1 行是一个整数 n 表示要在款表中存储数的个数,第 2 行是 n 个整数,第 3 行是 v。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0:
等)。
然后对应每个问题在一行中输出经过删除操作后的数。
typedef struct Node *PtrToNode;
struct Node { int Data;PtrToNode Next; };
typedef PtrToNode List; /* 定义单链表类型 */
#include<stdio.h>
#include<stdlib.h>
List EraseNodes(List h,int v)
{
PtrToNode k;
List final;
final=h;
while(h->Next)
{
if(h->Next->Data==v)
{
k=h->Next;
h->Next=k->Next;
}
else
h=h->Next;
}
return final;
}
void solve(void)
{
int num,a,v;
List result,final;
PtrToNode tempt,m;
scanf("%d",&num);
result=(List)malloc(sizeof(struct Node));
result->Next=NULL;
tempt=result;
for(int i=0;i<num;i++)
{
scanf("%d",&a);
m=(PtrToNode)malloc(sizeof(struct Node));
m->Data=a;
m->Next=NULL;
tempt->Next=m;
tempt=tempt->Next;
}
scanf("%d",&v);
final=EraseNodes(result,v);
if(final->Next==NULL)
{
printf(" ");
printf("\n");
}
else
{
while(final->Next)
{
printf("%d ",final->Next->Data);
final=final->Next;
}
printf("\n");
}
}
int main()
{int i,t;
scanf("%d",&t);
for (i=0;i<t;i++)
{ printf("case #%d:\n",i);
solve();
}
return 0;
}
这是老师修改前的注意区别
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <unordered_set>
#include <string>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct Node* PtrToNode;
struct Node {
int Data;
PtrToNode Next;
};
typedef PtrToNode List; /* 定义单链表类型 */
List EraseNodes(List h, int v)
{
PtrToNode k;
List final;
final = h;
while (h->Next)
{
if (h->Next->Data == v)
{
k = h->Next;
h->Next = k->Next;
}
else
h = h->Next;
}
return final;
}
void solve(void)
{
int num, a, v;
List result, final;
PtrToNode tempt, m;
scanf("%d", &num);
result = (List)malloc(sizeof(struct Node));
result->Next = NULL;
//tempt = result->Next; // 尾节点不是这样的(一)
tempt = result;
for (int i = 0;i < num;i++)
{
scanf("%d", &a);
m = (PtrToNode)malloc(sizeof(struct Node));
m->Data = a;
m->Next = NULL;
//tempt = m;(二)
tempt->Next = m;
tempt = tempt->Next;
}
scanf("%d", &v);
final =/*EraseNodes(result,v);*/result;
//if (final->Next) // (三)这你写错了
if (final->Next == NULL)
{
printf(" ");
printf("\n");
}
else
{
while (final->Next)
{
printf("%d", final->Next->Data);
final = final->Next;
}
printf("\n");
}
}
int main()
{
int i, t;
scanf("%d", &t);
// 你应该一次性输入所有字符,再处理各个问题(四)
for (i = 0;i < t;i++)
{
printf("case #%d:\n", i);
solve();
}
return 0;
}