/*删除指针数组中重复的字符串*/ #include<stdio.h> #include<string.h> int del_name(char **name,int n)//删除函数 { int i,j,k; for(i=0;i<n;i++) {for(j=j+1;j<n;) if(strcmp(name[i],name[j])==0)//比较两个字符串 {for(k=j;k<n;k++) name[k]=name[k+1];//字符串移位 name[k]=0; n--;//字符串个数-1 } else j++; } return n; } int main() { char *name[]={"tianjin","taiyuan","beijing","shanghai","tianjin","beijing"}; int n=sizeof(name)/sizeof(char*);//计算字符串的个数 printf("Before deleting:\n"); for(int k=0;k<n;k++) puts(name[k]); n=del_name(name,n);//调用删除函数 printf("After deleting:\n"); for(int k=0;k<n;k++) puts(name[k]); return 0; }为什么输出的有重复的beijing
时间: 2024-03-03 22:52:42 浏览: 46
在你的删除函数中,有一个错误,导致重复的字符串无法被正确删除。在第6行的循环语句中,变量j没有初始化,所以在第8行的比较语句中,j的值不确定,可能会比i小,导致重复的字符串没有被比较到。你可以将第6行的for循环语句改成以下形式,来解决这个问题:
```
for(i=0;i<n;i++)
{
for(j=i+1;j<n;)
{
if(strcmp(name[i],name[j])==0)
{
for(k=j;k<n;k++)
name[k]=name[k+1];
name[k]=0;
n--;
}
else
j++;
}
}
```
这样修改后,输出的结果就不会再有重复的字符串了。
相关问题
程序流程: 定义Employee类,包含员工姓名、基本工资和下一个结点的指针。 定义create_list函数,用于创建链表,通过输入员工姓名和基本工资来构造Employee对象,并将其添加到链表中。当输入姓名为空字符串或基本工资为0时,停止输入并返回头结点。 定义del_list函数,用于删除链表中等于给定基本工资的所有结点。首先判断头结点是否等于给定基本工资,如果是,则将头结点指向下一个结点;然后遍历链表中的每个结点,如果其下一个结点的基本工资等于给定基本工资,则将其下一个结点删除;最后返回头结点。 定义print_list函数,用于输出链表中每个结点的姓名和基本工资。 在主函数中调用create_list函数创建链表,然后输入要删除的基本工资,并调用del_list函数删除链表中等于给定基本工资的所有结点,最后调用print_list函数输出删除后的链表信息用C语言写
,程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义Employee类
typedef struct Employee {
char name[20]; // 姓名
float salary; // 基本工资
struct Employee *next; // 下一个结点的指针
} Employee;
// 创建链表函数
Employee *create_list() {
Employee *head = NULL; // 头结点指针
Employee *tail = NULL; // 尾结点指针
char name[20];
float salary;
// 输入员工姓名和基本工资,构造Employee对象,并将其添加到链表中
printf("Input name and salary of employee (stop with empty name or salary 0):\n");
while (1) {
scanf("%s%f", name, &salary);
if (strcmp(name, "") == 0 || salary == 0) {
break;
}
Employee *p = (Employee *)malloc(sizeof(Employee));
strcpy(p->name, name);
p->salary = salary;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
tail->next = p;
}
tail = p;
}
return head;
}
// 删除链表函数
Employee *del_list(Employee *head, float salary) {
// 如果头结点的基本工资等于给定基本工资,则将头结点指向下一个结点
while (head != NULL && head->salary == salary) {
Employee *p = head;
head = head->next;
free(p);
}
// 遍历链表中的每个结点,如果其下一个结点的基本工资等于给定基本工资,则将其下一个结点删除
Employee *p = head;
while (p != NULL && p->next != NULL) {
if (p->next->salary == salary) {
Employee *q = p->next;
p->next = q->next;
free(q);
} else {
p = p->next;
}
}
return head;
}
// 输出链表函数
void print_list(Employee *head) {
printf("Name\tSalary\n");
while (head != NULL) {
printf("%s\t%.2f\n", head->name, head->salary);
head = head->next;
}
}
// 主函数
int main() {
// 创建链表
Employee *head = create_list();
// 输入要删除的基本工资
float salary;
printf("Input salary to delete:\n");
scanf("%f", &salary);
// 删除链表中等于给定基本工资的所有结点
head = del_list(head, salary);
// 输出删除后的链表信息
print_list(head);
return 0;
}
阅读全文