如何用C语言做到增删改查 内详

就是用C语言编写一个小程序 在程序执行的时候
可以反复录入数据
然后还可以 修改数据
删除数据
查找数据

可以再设计几个输入指令 例如 输入 1是 增加数据 输入2为 查找数据
可以使用文件来完成
也可以是临时的

请给个源码
谢谢
要测试过的哦

第1个回答  推荐于2017-11-21
很早前帮朋友写的,跟你的需求很像,给你用吧。
你可改下main函数,使它更贴近你的需求。

如果你不会改,再帮你改吧。

-------------------------------------------
#include <time.h>
#include <stdio.h>

#define NULL -2
#define ERROR -1
#define OK 1
#define TRUE 2
#define FALSE 3
#define Boolen int
#define Status int

#define LIST_INIT_SIZE 3
#define LIST_INCREMENT 2
#define NAME_LEN 13
#define DES_LEN 30

char ErrDescription[DES_LEN];

typedef struct{
int NO;
char Name[NAME_LEN];
enum{male,female} Sex;
int Age;
char Tel[15];
char Inserttime[64];
}ElemType,*ElemPointer;

typedef struct{
ElemPointer base; //基址
int length; //表长
int listsize; //内存占用
int elemcount; //记录数
}SqList,*SqPointer;

int ErrorEXP(int i)
{
switch(i)
{ case 1: strcpy(ErrDescription,"InitList::(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)) 空间申请失败");break;
case 2: strcpy(ErrDescription,"IncreaseList::(ElemType *)realloc(L->base,(L->length + LIST_INCREMENT) * sizeof(ElemType)) 空间申请失败");break;
case 3: strcpy(ErrDescription,"if(!L->base) return Error; SqList不存在");break;
case 4: strcpy(ErrDescription,"GetElem:: i 越界");break;
case 5: strcpy(ErrDescription,"ListInsert:: i 越界");break;
case 6: strcpy(ErrDescription,"ListInsert:: CALL IncreaseList(L)==ERROR return Error 邻接空间申请失败,由ListInsert返回");break;
case 7: strcpy(ErrDescription,"ListDelete:: i 越界");break;
case 8: strcpy(ErrDescription,"KeyInList:: i 越界");break;
case 9: strcpy(ErrDescription,"KeyInList:: CALL ListInsert(L,i,temp)==ERROR return Error 邻接空间申请失败,由KeyInList返回");break;
case 10: strcpy(ErrDescription,"ScanfList:: CALL KeyInList(L,i++)==ERROR return Error");break;
}
puts("!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!\n");
puts(ErrDescription);
puts("\n!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!\n");
return ERROR;
}

Status InitList(SqPointer L)
{
L->base = 0; //不可不要!!! 去掉后即使(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType))失败,系统也会认为正常
L->base = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L->base) return ErrorEXP(1); //空间申请失败,返回
L->length = LIST_INIT_SIZE;
L->listsize = L->length * sizeof(ElemType);
L->elemcount = 0;
return OK;
}

Status IncreaseList(SqPointer L)
{
ElemPointer newbase;
newbase = (ElemType *)realloc(L->base,(L->length + LIST_INCREMENT) * sizeof(ElemType));
if(!newbase) return ErrorEXP(2);
L->base = newbase;
L->length += LIST_INCREMENT;
L->listsize = L->length * sizeof(ElemType);
return OK;
}

Status DestroyList(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
free(L->base);
L->length = NULL;
L->listsize = NULL;
L->elemcount = NULL;
return OK;
}

Status ClearList(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
L->elemcount = 0;
return OK;
}

Boolen ListEmpty(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(L->elemcount == 0)
return TRUE;
else
return FALSE;
}

int ListElemCount(SqPointer L)
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
return L->elemcount;
}

Status GetElem(SqPointer L,int i,ElemType *ret) //调用此函数需将ret指向main函数域某一ElemType变量
{
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i > L->elemcount) return ErrorEXP(4); //i越界,返回
*ret = L->base[i-1]; //i 从1开始 此种方法在main中改变*ret会直接更改链表中数据
return OK;
}
//重大发现 指针型 temp->base 普通型L.base
int LocateElem(SqPointer L,char Locatename[]) //返回的i从1开始
{
int i=0;
ElemType *temp;
if(!L->base) return ErrorEXP(3); //L不存在,返回
while(i<L->elemcount)
{
temp=&(L->base[i]); //改为temp=L->base[i++];并去除下面的i++; ??
if(strcmp(temp->Name,Locatename) == 0) return i+1; //不能用temp->Name==locatename来试图比较字符串
i++;
}
return 0;
}

Status ListInsert(SqPointer L,int i,ElemType newelem) //插入位置1<=i<=elemcount+1
{
ElemPointer newbase;
ElemType *temp,*flag;
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i<1 || i>L->elemcount + 1) return ErrorEXP(5);
if(L->elemcount == L->length)
if(IncreaseList(L)==ERROR) return ErrorEXP(6);
flag=&(L->base[i-1]); //插入位置
for(temp=&(L->base[L->elemcount-1]);temp>=flag;temp--)
*(temp+1)=*temp;
*flag=newelem;
L->elemcount++;
return OK;
}

Status ListDelete(SqPointer L,int i,ElemType *ret) //调用此函数需将ret指向main函数域某一ElemType变量
{
ElemType *temp;
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i<1 || i>L->elemcount) return ErrorEXP(7);
*ret=L->base[i-1]; //删除位置,这里先返回该值
for(temp=&(L->base[i]);temp<=&(L->base[L->elemcount-1]);temp++)
*(temp-1)=*temp;
L->elemcount--;
return OK;
}

Status KeyInList(SqPointer L,int i)
{
ElemType temp;
time_t t;
char tmp[64];
char S;
if(!L->base) return ErrorEXP(3); //L不存在,返回
if(i<1 || i>L->elemcount + 1) return ErrorEXP(8);
printf("正在输入第%d个元素的值:",i);
printf("\n编号:(int)\n");
scanf("%d",&temp.NO);
printf("\n姓名:(char *)\n");
scanf("%s",&temp.Name);
printf("\n性别:(m or f)\n");
do{
S=getch();
if(S=='m')
temp.Sex=male;
else if(S=='f')
temp.Sex=female;
else
puts("Key in 'm' or 'f'.\n");
}while(S!='m' && S!='f');
putchar(S);
printf("\n年龄:(int)\n");
scanf("%d",&temp.Age);
printf("\n电话:(char *)\n");
scanf("%s",&temp.Tel);
printf("\n记录时间:\n");
t=time(0);
strftime(tmp,sizeof(tmp),"%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t));
puts(tmp);
strcpy(temp.Inserttime,tmp);

if(ListInsert(L,i,temp)==OK)
return OK;
else
return ErrorEXP(9);
}

ElemType ScanfElem()
{
ElemType temp;
time_t t;
char tmp[64];
char S;
printf("正在录入元素:");
printf("\n编号:(int)\n");
scanf("%d",&temp.NO);
printf("\n姓名:(char *)\n");
scanf("%s",&temp.Name);
printf("\n性别:(m or f)\n");
do{
S=getch();
if(S=='m')
temp.Sex=male;
else if(S=='f')
temp.Sex=female;
else
puts("Key in 'm' or 'f'.\n");
}while(S!='m' && S!='f');
putchar(S);
printf("\n年龄:(int)\n");
scanf("%d",&temp.Age);
printf("\n电话:(char *)\n");
scanf("%s",&temp.Tel);
printf("\n记录时间:\n");
t=time(0);
strftime(tmp,sizeof(tmp),"%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t));
puts(tmp);
strcpy(temp.Inserttime,tmp);

return temp;
}

Status ScanfList(SqPointer L,int i)
{
char p='c';
while(putchar('\n'),p=='c'||p=='C')
{ p='\0';

if(KeyInList(L,i++)==ERROR) return ErrorEXP(10);

printf("\nPress ESC key to exit or 'C' to continue...");
while(p!='c' && p!='C' && (int)p!=27)
p=getch();
}
return OK;
}

Status PrintListProperty(SqPointer L)
{
puts("SqList L Property:");
if(!L->base)
{ puts("链表不存在!");
return OK;}
else
puts("链表已初始化...\n");
printf("%d/%d BASE=%d,MemoryStatus=%d\n",L->elemcount,L->length,L->base,L->listsize);
return OK;
}

Status PrintOnScreen(SqPointer L)
{
int i;
char Stmp[7],t;
if(!L->base) return ErrorEXP(3); //L不存在,返回
puts("Push 'C' shell CLS or other key to skip.");
t=getch();
if(t=='c' || t=='C')
system("cls");
puts("数据表打印:");
for(i=0;i<=L->elemcount-1;i++)
{ printf("\nElem %d st:\n",i+1);
if(L->base[i].Sex == male)
strcpy(Stmp,"male");
else if(L->base[i].Sex == female)
strcpy(Stmp,"female");
else
strcpy(Stmp,"Unknow");
printf("NO:%d\tName:%s\t\tSex:%s\tAge:%d\n\tTel:%s\n\tInsertTime:%s\n",L->base[i].NO,L->base[i].Name,Stmp,L->base[i].Age,L->base[i].Tel,L->base[i].Inserttime);
}
return OK;
}

Status PrintElem(ElemPointer elem)
{
char Stmp[7];
printf("\nPrintElem:\n");
if(elem->Sex == male)
strcpy(Stmp,"male");
else if(elem->Sex == female)
strcpy(Stmp,"female");
else
strcpy(Stmp,"Unknow");
printf("NO:%d\tName:%s\t\tSex:%s\tAge:%d\n\tTel:%s\n\tInsertTime:%s\n",elem->NO,elem->Name,Stmp,elem->Age,elem->Tel,elem->Inserttime);
return OK;
}

void main() //把以上所有函数都串了起来
{
SqList TheList;
SqPointer ListP;
ElemType mylistelem,*elemtemp;
ElemPointer mylist;
int i;
char nameT[20];

elemtemp=&mylistelem; //*ret

ListP=&TheList;
if(InitList(ListP)==OK) puts("InitList(TheList)==OK");
PrintListProperty(ListP);
if(ListEmpty(ListP)==TRUE) puts("ListEmpty==True");
else puts("ListEmpty==False");
ScanfList(ListP,1);
PrintListProperty(ListP);
PrintOnScreen(ListP);

printf("ListElemCount return %d.",ListElemCount(ListP));

puts("\nGetElem index? ");
scanf("%d",&i);
if(GetElem(ListP,i,elemtemp)==OK) PrintElem(elemtemp);

puts("\nLocateElem name? ");
scanf("%s",nameT);
printf("LocateElem return %d.",LocateElem(ListP,nameT));

puts("\nListDelete index? ");
scanf("%d",&i);
if(ListDelete(ListP,i,elemtemp)==OK) PrintElem(elemtemp);

puts("\nListInsert index? ");
scanf("%d",&i);
puts("\nListInsert NEWELEM? ");
ListInsert(ListP,i,ScanfElem());
PrintListProperty(ListP);
PrintOnScreen(ListP);

if(ClearList(ListP)==OK) puts("ClearList==OK");
if(ListEmpty(ListP)==TRUE) puts("ListEmpty==True");
if(DestroyList(ListP)==OK) puts("DestroyList==OK");

getch();
}

/* 函数列表
类型 名称 参数 说明
int ErrorEXP (int i) 错误描述符
Status InitList (SqPointer L) 初始化SqPointer L... 通过L返回base
Status IncreaseList (SqPointer L) L当前满时,继续申请空间
Status DestroyList (SqPointer L) 销毁L
Status ClearList (SqPointer L) 把L置为空表
Boolen ListEmpty (SqPointer L) 判断L是否为空表,是则返回TRUE
int ListElemCount (SqPointer L) 返回当前L中记录的元素个数
Status GetElem (SqPointer L,int i,ElemType *ret) 通过*ret返回i号元素
int LocateElem (SqPointer L,char Locatename[]) 顺序查找表,根据name字段,返回首个匹配元素的i,无则返回0
Status ListInsert (SqPointer L,int i,ElemType newelem) 在L中的i号位置插入newelem元素
Status ListDelete (SqPointer L,int i,ElemType *ret) 删除L中第i号元素,并用*ret返回该元素
Status KeyInList (SqPointer L,int i) 从键盘输入单个元素并插入到i号位置
ElemType ScanfElem () 从键盘输入单个元素返回一个ElemType类型的节点
Status ScanfList (SqPointer L,int i) 从i号开始递增顺序录入元素到L,直到按'ESC'
Status PrintListProperty(SqPointer L) 打印L的属性,打印格式为(已用空间/已申请空间 基址 内存占用)
Status PrintOnScreen (SqPointer L) 打印整张L表到屏幕
Status PrintElem (ElemPointer elem) 打印单个ElemType类型的元素

时间仓促,所以乱了些,书上2章开头 动态线性的顺序表 的基本操作几乎都写了
不知你说的是不是这个,mian函数比较乱,只是把所有的基本操作都串了起来,你
可以根据情况改改主函数的调用过程,就会比较清楚是怎么实现的了。你可以按F10
进行单部跟踪,F11可以进入调用过程,一步一步跟着程序走一遍就好了。
关于动态链表的我之前写过一个,也好象给你看过,这里再附上一起发过去。文件LinkList.c
只实现了构造链表,并打印出来的功能。
*/本回答被提问者采纳
第2个回答  2009-06-23
Just pass by.

C语言。怎么删除结构体里的某个成员,就是增删改查里的删?我只学到结 ...
想要删除s[5],只需将其之后的元素依次往前移将前一个元素覆盖就好了,然后最后一个元素不用就行了!

如何用C语言做到增删改查 内详
就是用C语言编写一个小程序在程序执行的时候可以反复录入数据然后还可以修改数据删除数据查找数据可以再设计几个输入指令例如输入1是增加数据输入2为查找数据可以使用文件来完成也可以... 就是用C语言编写一个小程序 在程序执行的时候可以反复录入数据然后还可以 修改数据 删除数据 查找数据可以再设计几个输入指令 例如...

编写一个c语言程序,实现录入学生学号和姓名信息的功能
1、首先创建一个c语言项目。然后右键头文件,创建一个Stu的头文件。2、然后编写头文件的代码。再将数据结构的增删改查和结构体写入头文件。3、然后在源文件中创建main源文件和Stu源文件。再main文件中写入int mian()代码。4、然后在mian主函数中,写入while语句无限循环。再写入Init函数。5、然后在St...

c语言 如何删除文件中的一行,求解答!
一、最简单的办法,建议读到链表里,删除其中一个节点。然后再覆盖写回到文件。二、找到要删除的位置,fseek到该位置,将之后需要保留的文件内容,从这里开始写。三、利用内存映射,将文件映射到内存,直接对内存修改,但是对内存修改,也是需要类似于方法2,将需要保留的内容重新移动位置。综上,方法一最...

我想知道关于快递单号如何用c语言进行编译实现增删改查 具体写一下
2009-07-06 如何用C语言做到增删改查 内详 16 2011-12-27 C语言中怎样用链表实现增删改查 18 2013-07-24 谁知道用c语言向数据库做增删改查吗? 4 2014-12-24 C语言数组 增删改查 删改两个程序怎么写 2 2011-12-11 c语言 建立一个链表,实现增删改查 4 2017-01-19 求帮助,c语言,学生成绩...

用C语言实现一个小学生口算及自测系统,实现自动出题,根据答题情况评分并...
printf( "请答题 Ctrl+C 结束...\\n" );while(1){ v1 = GEN_VALUE(); \/\/随机生成第1个算数 v2 = GEN_VALUE(); \/\/随机生成第2个算数 op = ops[ RANDOM(0,3) ]; \/\/随机决定是哪个运算符 \/\/保证第1个算数大于第2个算数,如不需要,则把这个判断删除即可 if( v1<v2 ){ t = ...

C语言也能使用的哈希表·uthash
要使用uthash,首先需要下载uthash.h文件并在代码中包含。关键步骤是定义自定义的哈希节点结构,并利用uthash提供的宏函数进行增删改查操作。增删操作会直接修改hashtable结构,所以必须传入原对象。删除操作仅标记删除,源对象内存需手动释放。哈希表仅标记节点存在,不管理实体对象,修改操作则直接在节点中进行...

winfrom程序(c#)里面怎么怎么操作wps(excel)啊?求源代码,可以运行的...
\/\/删除节点,先要查到节点 XmlNode delNode = dom.SelectSingleNode("\/books\/book[@id='5']");XmlElement newNode=dom.CreateElement("book");newNode.InnerText="abcde";\/\/root.RemoveChild(delNode); \/\/移除节点 \/\/修改 newNode.FirstChild.InnerText = "C语言大全";root.ReplaceChild(newNode,...

求一个C语言程序。小型数据库。一个管理系统。功能包括:查询,修改等等...
include "ctype.h"include "string.h"define MAX 4 define TERM 6 struct STUD{ unsigned number;char name[20];unsigned score[MAX];float average;struct STUD *next;};struct CLASS{ unsigned no;unsigned students;float score[MAX];float average;struct STUD *first;};\/\/输出所有学生的成绩及...

一口气玩转链表(C语言版)
节点与头结点链表中的每个元素被称为节点,包含数据域和指针域。头结点并非必需,但用于标识链表的起始位置。在C语言中,可以定义一个结构体来表示节点,如头结点的创建和使用。链表操作创建链表后,可以进行增删查改操作。向链表添加元素、删除指定元素、查找数据以及更新元素都有特定的步骤和实现代码,这些...

相似回答