C语言中怎样实现对数组数据的删除、修改?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中怎样实现对数组数据的删除、修改?相关的知识,希望对你有一定的参考价值。
想要删除/修改结构体中的一组数据,比如要删除第i组数据,采用第i项后面的数据都向前移位的方法覆盖第i项数据,高手帮忙写出这个程序来,解释要清楚点啊,我菜鸟一个,谢谢。
分不多,希望高手无私帮助啊,感谢!!!
2楼的朋友,程序前几句有不懂的,能不能解释一下啊?我菜。。。
#include <stdio.h>
// 删除长度为len的数组dat中索引为idx的元素。
void remove(int *dat, int *len, int idx)
(*len)--;
if (idx < 0 || idx >= *len)
return;
for (int i = idx; i < *len; i++)
dat[i] = dat[i+1];
void output(int *dat, int len)
for (int i = 0; i < len; i++)
printf("%d ", dat[i]);
printf("\\n");
int main()
int a[10]= 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, len = 10;
remove(a, &len, 5);
output(a, len);
remove(a, &len, 2);
output(a, len);
return 0;
typedef struct Node
int a,b;
node;
node c[100];
int n;
void print()
int i;
printf("\n当前数据:\n");
for(i=1;i<=n;i++)
printf("第%d组:a=%d,b=%d\n",i,c[i].a,c[i].b);
printf("\n\n");
//输出
void setnum()
int i;
printf("输入n,表示共有n组数据:\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
printf("输入第%d组数据的两个值a、b,用空格隔开:\n",i);
scanf("%d%d",&c[i].a,&c[i].b);
//设置数据
void remove()
int i,j;
printf("输入i,表示要删除第i数据:\n");
scanf("%d",&i);
for(j=i;j<=n-1;j++)
c[j]=c[j+1];
//循环覆盖,让后一个覆盖前一个,所以j最大值取n-1
n--;//结构体中的元素减少1个
//删除数据
void chang()
int i,aa,bb;
printf("输入i,a,b,表示要将第i组数据修改成a、b:\n");
scanf("%d%d%d",&i,&aa,&bb);
c[i].a=aa;
c[i].b=bb;//直接赋值修改
//修改数据
main()
int m;
while(1)
printf("输入:1-输入数据,2-修改数据,3-删除数据\n 4-输出数据,0-退出\n");
scanf("%d",&m);
if(m==0) break;
else if(m==1) setnum();
else if(m==2) chang();
else if(m==3) remove();
else if(m==4) print();
本回答被提问者和网友采纳 参考技术B #include<stdio.h>
typedef struct Node
int a,b;
node;
node c[100];
int n;
void print()
int i;
printf("\n当前数据:\n");
for(i=1;i<=n;i++)
printf("第%d组:a=%d,b=%d\n",i,c[i].a,c[i].b);
printf("\n\n");
//输出
void setnum()
int i;
printf("输入n,表示共有n组数据:\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
printf("输入第%d组数据的两个值a、b,用空格隔开:\n",i);
scanf("%d%d",&c[i].a,&c[i].b);
//设置数据
void remove()
int i,j;
printf("输入i,表示要删除第i数据:\n");
scanf("%d",&i);
for(j=i;j<=n-1;j++)
c[j]=c[j+1];
//循环覆盖,让后一个覆盖前一个,所以j最大值取n-1
n--;//结构体中的元素减少1个
//删除数据
void chang()
int i,aa,bb;
printf("输入i,a,b,表示要将第i组数据修改成a、b:\n");
scanf("%d%d%d",&i,&aa,&bb);
c[i].a=aa;
c[i].b=bb;//直接赋值修改
//修改数据
main()
int m;
while(1)
printf("输入:1-输入数据,2-修改数据,3-删除数据\n 4-输出数据,0-退出\n");
scanf("%d",&m);
if(m==0) break;
else if(m==1) setnum();
else if(m==2) chang();
else if(m==3) remove();
else if(m==4) print();
参考技术C 直接用数组名加下标进行修改。
删除是删不了的,你可以约定一个值是无效的,然后修改成那个无效值当做删除 参考技术D 通过数组的下标定位到需要删除修改的元素,即可完成对数据的删除,修改
eg:一个4*4的二维数组a[4][4],先要修改第一行第二个数据的话,通过下标找到该数据的为a[0][1],直接对a[0][1]赋值即可完成修改删除,
当然如果数组元素的类型比较复杂的话,按照该数据类型的语法法则进行赋值,修改,原理是一样的.
用C语言写一个链表储存学生信息
题目
已知学生基本信息由学号(长整型)、姓名(字符数组)、性别(字符型)、年龄(整型)组成。编程实现:建立一个结点按学号顺序存储学生信息的单向链表,并实现依据学号对链表的添加、修改、删除和检索功能;添加新结点后,应继续保持结点按学号顺序的链接方式。分别定义函数实现链表的初始化、链表的打印输出、以及在链表中添加、修改、删除和检索节点的功能。
基本思路
建立单向链表,存储学生数据,用不同函数实现上述功能,在主函数中调用函数进行操作。
代码实现
定义结构体类型存储信息
struct STUDENT_NODE {
long int id;
char name[MAX_LEN];
char sex;
int age;
// 指针指向下一个结点,用以形成链表
struct STUDENT_NODE* next;
};
//定义结构体:存储单向链表
struct STUDENT_LINK {
struct STUDENT_NODE* top;
};
typedef struct STUDENT_NODE Node;
typedef struct STUDENT_LINK STUDENT_LINK;
在主函数中定义struct STUDENT_LINK类型的变量用于储存链表
STUDENT_LINK * L,H;
L = &H;
编写建立链表的函数,(并且初始化)
void iniStudentLink(STUDENT_LINK* L) //初始化学生链表
{
Node* tail= NULL;
L->top = NULL;
Node* q;
q = (Node*)malloc(sizeof(Node));
scanf("%ld", &q->id);
getchar();
while (q->id != 0)
{
scanf("%s %c %d", q->name, &q->sex, &q->age);
if (L->top == NULL)
{
L->top = q;
L->top->next = NULL;
}
if (tail != NULL)//tail为开辟节点
{
tail->next = q;
}
tail = q;
tail->next = NULL;
q = (Node*)malloc(sizeof(Node));
scanf("%ld", &q->id);
getchar();
}
}
输出链表
void ShowALL(STUDENT_LINK* L) // 从头到尾,输出当前所有的同学信息
{
Node* p;
p = L->top;
if (p == NULL)
printf("empty!\n");
for (p = L->top; p != NULL; p = p->next)
printf("%d %s %c %d\n", p->id, p->name, p->sex, p->age);
}
清空学生信息
void clearStudentLink(STUDENT_LINK* L) //清空学生链表
{
Node* p;
while (L->top)
{
p = L->top;//p指向头节点后的第一个节点
L->top = p->next;//删除节点p
free(p);//释放节点p的空间
}
}
判断学生的信息是否存在
int isExist(STUDENT_LINK* L, long int id) // 判断该学号的学生信息是否存在
{
Node* p;
p = L->top;
while (p)
{
if (p->id == id)
return 1;
p = p->next;
}
return 0;
}
添加一个新的学生的信息
int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age) //添加一个新同学的信息
{
Node* temp = L->top;//创建临时节点
while (temp->next != NULL)
{
temp = temp->next;
}
Node* p = (Node*)malloc(sizeof(Node));//创建新节点
p->id = id;
strcpy(p->name, name);
p->sex = sex;
p->age = age;
//向链表中插入节点
p->next = temp->next;
temp->next = p;
return 0;
}
任意修改学生的信息
int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age) // 根据学号,修改该同学的信息
{
Node* p = L->top;
while (p->id != id)
{
p = p->next;
}
p->id = id;
strcpy(p->name, name);
p->sex = sex;
p->age = age;
return 0;
}
任意删除学生的信息
int Delete(STUDENT_LINK* L, long int id) // 根据学号,从链表中删除该同学的信息
{
Node* p1, * p2, * temp;
if (isExist(L, id))
{
if (id == L->top->id) /*删除的是首元结点*/
{
temp = L->top;
L->top = L->top->next; /*解除首元节点与链表的连接*/
free(temp); /*释放该结点的内存*/
}
else
{
p2 = L->top;
p1 = p2->next;
while (p1->id != id)
{
p2 = p1;
p1 = p1->next;
}
temp = p1;
p2->next = p1->next;
free(temp);
}
}
else
printf("%ld not found\n", id);
return 0;
}
检索学生的信息
int Search(STUDENT_LINK* L, long int id) // 根据学号,输出显示该同学信息
{
if (isExist(L, id))
{
Node* p = L->top;
while (p->id != id)
{
p = p->next;
}
printf("%ld %s %c %d\n", p->id, p->name, p->sex, p->age);
}
else
printf("%ld not found\n", id);
return 0;
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_LEN 5
struct STUDENT_NODE {
long int id;
char name[MAX_LEN];
char sex;
int age;
// 指针指向下一个结点,用以形成链表
struct STUDENT_NODE* next;
};
//定义结构体:存储单向链表
struct STUDENT_LINK {
struct STUDENT_NODE* top;
};
typedef struct STUDENT_NODE Node;
typedef struct STUDENT_LINK STUDENT_LINK;
void iniStudentLink(STUDENT_LINK* L); //初始化学生链表
void clearStudentLink(STUDENT_LINK* L); //清空学生链表
int isExist(STUDENT_LINK* L, long int id); // 判断该学号的学生信息是否存在
int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age); //添加一个新同学的信息
int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age); // 根据学号,修改该同学的信息
int Delete(STUDENT_LINK* L, long int id); // 根据学号,从链表中删除该同学的信息
int Search(STUDENT_LINK* L, long int id); // 根据学号,输出显示该同学信息
void ShowALL(STUDENT_LINK* L); // 从头到尾,输出当前所有的同学信息
int main()
{
STUDENT_LINK * L,H;
L = &H;
int age;
char sex;
char name[MAX_LEN];
long int id;
iniStudentLink(L);
printf("此时学生信息表为:\n");
ShowALL(L);
printf("输入添加的id:\n");
scanf("%ld", &id);
getchar();
printf("输入添加同学的数据:\n");
scanf("%s %c %d", name, &sex, &age);
getchar();
Add(L, id, name, sex, age);
printf("添加后:\n");
ShowALL(L);
printf("输入修改的id:\n");
scanf("%ld", &id);
getchar();
printf("输入修改后的信息:\n");
scanf("%s %c %d", name, &sex, &age);
getchar();
Modify(L, id, name, sex, age);
printf("修改后:\n");
ShowALL(L);
printf("输入删除的id:\n");
scanf("%ld", &id);
getchar();
Delete(L, id);
printf("删除之后:\n");
ShowALL(L);
printf("输入查找的id:\n");
scanf("%d", &id);
getchar();
printf("该学生的信息为:\n");
Search(L, id);
printf("清除所有信息!\n");
clearStudentLink(L);
printf("清除后的信息表为:\n");
ShowALL(L);
return 0;
}
void iniStudentLink(STUDENT_LINK* L) //初始化学生链表
{
Node* tail= NULL;
L->top = NULL;
Node* q;
q = (Node*)malloc(sizeof(Node));
scanf("%ld", &q->id);
getchar();
while (q->id != 0)
{
scanf("%s %c %d", q->name, &q->sex, &q->age);
if (L->top == NULL)
{
L->top = q;
L->top->next = NULL;
}
if (tail != NULL)//tail为开辟节点
{
tail->next = q;
}
tail = q;
tail->next = NULL;
q = (Node*)malloc(sizeof(Node));
scanf("%ld", &q->id);
getchar();
}
}
void ShowALL(STUDENT_LINK* L) // 从头到尾,输出当前所有的同学信息
{
Node* p;
p = L->top;
if (p == NULL)
printf("empty!\n");
for (p = L->top; p != NULL; p = p->next)
printf("%d %s %c %d\n", p->id, p->name, p->sex, p->age);
}
void clearStudentLink(STUDENT_LINK* L) //清空学生链表
{
Node* p;
while (L->top)
{
p = L->top;//p指向头节点后的第一个节点
L->top = p->next;//删除节点p
free(p);//释放节点p的空间
}
}
int isExist(STUDENT_LINK* L, long int id) // 判断该学号的学生信息是否存在
{
Node* p;
p = L->top;
while (p)
{
if (p->id == id)
return 1;
p = p->next;
}
return 0;
}
int Add(STUDENT_LINK* L, long int id, char name[], char sex, int age) //添加一个新同学的信息
{
Node* temp = L->top;//创建临时节点
while (temp->next != NULL)
{
temp = temp->next;
}
Node* p = (Node*)malloc(sizeof(Node));//创建新节点
p->id = id;
strcpy(p->name, name);
p->sex = sex;
p->age = age;
//向链表中插入节点
p->next = temp->next;
temp->next = p;
return 0;
}
int Modify(STUDENT_LINK* L, long int id, char name[], char sex, int age) // 根据学号,修改该同学的信息
{
Node* p = L->top;
while (p->id != id)
{
p = p->next;
}
p->id = id;
strcpy(p->name, name);
p->sex = sex;
p->age = age;
return 0;
}
int Delete(STUDENT_LINK* L, long int id) // 根据学号,从链表中删除该同学的信息
{
Node* p1, * p2, * temp;
if (isExist(L, id))
{
if (id == L->top->id) /*删除的是首元结点*/
{
temp = L->top;
L->top = L->top->next; /*解除首元节点与链表的连接*/
free(temp); /*释放该结点的内存*/
}
else
{
p2 = L->top;
p1 = p2->next;
while (p1->id != id)
{
p2 = p1;
p1 = p1->next;
}
temp = p1;
p2->next = p1->next;
free(temp);
}
}
else
printf("%ld not found\n", id);
return 0;
}
int Search(STUDENT_LINK* L, long int id) // 根据学号,输出显示该同学信息
{
if (isExist(L, id))
{
Node* p = L->top;
while (p->id != id)
{
p = p->next;
}
printf("%ld %s %c %d\n", p->id, p->name, p->sex, p->age);
}
else
printf("%ld not found\n", id);
return 0;
}
以上是关于C语言中怎样实现对数组数据的删除、修改?的主要内容,如果未能解决你的问题,请参考以下文章
C语言中,怎样判断一个数组中是不是有重复元素呢?最好用程序实现