當前位置:成語大全網 - 書法字典 - 如何用C語言添加、刪除、修改和查看細節

如何用C語言添加、刪除、修改和查看細節

很久以前寫給朋友的,和妳的需求很像。我會給妳的。

您可以更改主要功能,使其更接近您的需求。

如果妳改不了,我幫妳改。

-

# include & lttime.h & gt

# include & ltstdio.h & gt

#定義NULL -2

#定義錯誤-1

#定義OK 1

#定義正確2

#定義錯誤3

#定義Boolen int

#定義狀態int

#define LIST_INIT_SIZE 3

#定義列表_增量2

#define NAME_LEN 13

#定義DES_LEN 30

char err description[DES _ LEN];

typedef結構{

int號;

char Name[Name _ LEN];

enum {男,女}性別;

int Age

char聯系電話[15];

char Inserttime[64];

}ElemType,* ElemPointer

typedef結構{

ElemPointer base//基址

int長度;//表格長度

int listsize//內存使用

整數計數;//記錄的數量

}SqList,* SqPointer

int ErrorEXP(int i)

{

開關(壹)

{ case 1:strcpy(err description," init list::(element type *)malloc(list _ init _ size * sizeof(element type))申請空間失敗");打破;

案例2: strcpy(ErrDescription," increase list::(elem type *)realloc(L-& gt;堿基,(L->;length+list _ increment)* sizeof(elem type))空間應用失敗”);打破;

案例3: strcpy(ErrDescription," if(!l-& gt;base)返回錯誤;SqList不存在”);打破;

案例四:strcpy (err描述,“getelem::我越界了”);打破;

情況5: strcpy (err description,“list insert:: I越界”);打破;

案例6: strcpy (err description," ListInsert::call increase list(l)= = error return error申請相鄰空間失敗,list insert返回));打破;

情況7: strcpy (err description,“list delete:: I越界”);打破;

情況8: strcpy (err description,“keyinlist:: I越界”);打破;

情況9: strcpy (err description," KeyInList:: call listinsert (l,I,temp) = = error returnerror相鄰空間申請失敗,被KeyInList返回);打破;

案例10: strcpy(ErrDescription," ScanfList:: CALL KeyInList(L,i++)= ERROR return ERROR ");打破;

}

puts(!!!!!!!!!!!!!!!錯誤!!!!!!!!!!!!!!!\ n ");

puts(ErrDescription);

puts("\n!!!!!!!!!!!!!!!錯誤!!!!!!!!!!!!!!!\ n ");

返回錯誤;

}

狀態初始化列表(SQL指針L)

{

l-& gt;基數= 0;//不要!!!即使刪除後(elem type *)malloc(list _ init _ size * sizeof(elem type))失敗,系統仍會認為是正常的。

l-& gt;base =(elem type *)malloc(LIST _ INIT _ SIZE * sizeof(elem type));

如果(!l-& gt;base)返回error exp(1);//空間申請失敗,返回。

l-& gt;長度= LIST _ INIT _ SIZE

l-& gt;list size = L-& gt;長度* sizeof(elem type);

l-& gt;elem count = 0;

退貨OK;

}

狀態增加列表(SqPointer L)

{

ElemPointer newbase

new base =(elem type *)realloc(L-& gt;堿基,(L->;length+LIST _ INCREMENT)* sizeof(elem type));

如果(!newbase)返回error exp(2);

l-& gt;base = newbase

l-& gt;長度+= LIST _ INCREMENT;

l-& gt;list size = L-& gt;長度* sizeof(elem type);

退貨OK;

}

狀態銷毀列表(SQL指針L)

{

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

免費(L->;基地);

l-& gt;長度= NULL

l-& gt;listsize = NULL

l-& gt;elemcount = NULL

退貨OK;

}

狀態清除列表(SQL指針L)

{

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

l-& gt;elem count = 0;

退貨OK;

}

boolen list empty(SQL指針L)

{

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

如果(L-& gt;elemcount == 0)

返回TRUE

其他

返回FALSE

}

int ListElemCount(SQL pointer L)

{

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

返回L-& gt;elemcount

}

status get elem(SQL pointer l,int i,ElemType * ret)//要調用這個函數,需要將ret指向主函數域中的壹個elem type變量。

{

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

如果(i & gtl-& gt;elemcount)返回error exp(4);//我越界了,又回來了。

* ret = L-& gt;base[I-1];//i從1開始,在main中改變*ret會直接改變鏈表中的數據。

退貨OK;

}

//重要發現指針temp-& gt;普通L.base

intlocatelem(SQL pointer l,charlocate name[])//我返回的從1開始。

{

int I = 0;

ElemType * temp

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

while(我& ltl-& gt;elemcount)

{

temp = & amp(L->;base[I]);//更改為temp = L-& gt;base[i++];並移除下面的i++;

if(strcmp(temp-& gt;Name,Locatename) == 0)返回I+1;//不能使用temp-& gt;Name==locatename嘗試比較字符串。

i++;

}

返回0;

}

狀態列表插入(sqpointer l,int i,elem type new elem)//插入位置1

{

ElemPointer newbase

ElemType *temp,* flag

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

如果(我& lt1 | | I & gt;l-& gt;elemcount + 1)返回error exp(5);

如果(L-& gt;elem count = = L-& gt;長度)

if(IncreaseList(L)==ERROR)返回ERROR exp(6);

flag = & amp(L->;base[I-1]);//插入位置

for(temp = & amp;(L->;base[L-& gt;elem count-1]);temp & gt=標誌;溫度-)

*(temp+1)= * temp;

* flag = newelem

l-& gt;elem count++;

退貨OK;

}

狀態列表delete(SQL pointer l,int i,ElemType * ret)//要調用這個函數,需要將ret指向主函數域中的壹個elem type變量。

{

ElemType * temp

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

如果(我& lt1 | | I & gt;l-& gt;elemcount)返回error exp(7);

* ret = L-& gt;base[I-1];//刪除位置,先在這裏返回值。

for(temp = & amp;(L->;base[I]);temp & lt= & amp(L->;base[L-& gt;elem count-1]);temp++)

*(temp-1)= * temp;

l-& gt;elem count-;

退貨OK;

}

status key in list(SQL pointer L,int i)

{

元素類型溫度;

time _ t t

char tmp[64];

char S;

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

如果(我& lt1 | | I & gt;l-& gt;elemcount + 1)返回error exp(8);

Printf("輸入%d元素的值:",I);

printf(" \ n number:(int)\ n ");

scanf("%d ",& amp在…之時否);

printf(" \ n name:(char *)\ n ");

scanf("%s ",& amp在…之時姓名);

Printf ("\ nGender: (m或f)\ n ");

做{

s = getch();

如果(S=='m ')

在…之時性別=男性;

else if(S=='f ')

在…之時性別=女性;

其他

puts("鍵入' m '或' f。\ n ");

}while(S!= ' m ' & amp& amps!= ' f ');

putchar(S);

printf(" \ nAge:(int)\ n ");

scanf("%d ",& amp在…之時年齡);

printf(" \ nTel:(char *)\ n ");

scanf("%s ",& amp在…之時電話);

printf(" \ n錄制時間:\ n ");

t =時間(0);

Strftime (tmp,sizeof (tmp)," %y/%m/%d% x% a %j day% z "今年當地時間(&;t));

賣出(tmp);

strcpy(溫度。Inserttime,tmp);

if(ListInsert(L,I,temp)==OK)

退貨OK;

其他

返回error exp(9);

}

ElemType ScanfElem()

{

元素類型溫度;

time _ t t

char tmp[64];

char S;

Printf("輸入元素:");

printf(" \ n number:(int)\ n ");

scanf("%d ",& amp在…之時否);

printf(" \ n name:(char *)\ n ");

scanf("%s ",& amp在…之時姓名);

Printf ("\ nGender: (m或f)\ n ");

做{

s = getch();

如果(S=='m ')

在…之時性別=男性;

else if(S=='f ')

在…之時性別=女性;

其他

puts("鍵入' m '或' f。\ n ");

}while(S!= ' m ' & amp& amps!= ' f ');

putchar(S);

printf(" \ nAge:(int)\ n ");

scanf("%d ",& amp在…之時年齡);

printf(" \ nTel:(char *)\ n ");

scanf("%s ",& amp在…之時電話);

printf(" \ n錄制時間:\ n ");

t =時間(0);

Strftime (tmp,sizeof (tmp)," %y/%m/%d% x% a %j day% z "今年當地時間(&;t));

賣出(tmp);

strcpy(溫度。Inserttime,tmp);

返回溫度;

}

狀態掃描列表(SqPointer L,int i)

{

char p = ' c

while(putchar('\n '),p=='c'||p=='C ')

{ p = ' \ 0

if(KeyInList(L,i++)= ERROR)返回ERROR exp(10);

printf(" \ n按ESC鍵退出,或按“C”繼續...");

而(p!= ' c ' & amp& ampp!= ' C ' & amp& amp(int)p!=27)

p = getch();

}

退貨OK;

}

狀態PrintListProperty(SQL pointer L)

{

puts(" SQL list L Property:");

如果(!l-& gt;基地)

{puts("鏈表不存在!");

退貨OK;}

其他

Puts("鏈表已初始化...\ n ");

printf("%d/%d BASE=%d,MemoryStatus=%d\n ",L-& gt;elemcount,L-& gt;長度,L-& gt;堿基,L-& gt;listsize);

退貨OK;

}

屏幕上的狀態打印(SQL指針L)

{

int I;

char Stmp[7],t;

如果(!l-& gt;base)返回error exp(3);//L不存在,返回

puts("按“C”shell CLS或其他鍵跳過。");

t = getch();

if(t=='c' || t=='C ')

系統(“cls”);

Puts("數據表打印:");

for(I = 0;我& lt= L-& gt;elem count-1;i++)

{ printf("\nElem %d st:\n ",I+1);

如果(L-& gt;基數[i]。性別==男性)

strcpy(Stmp,“男”);

else if(L-& gt;基數[i]。性別==女性)

strcpy(Stmp,“女”);

其他

strcpy(Stmp," Unknow ");

printf(" NO:% d \ t name:% s \ t \ tSex:% s \ tAge:% d \ n \ t tel:%s\n \ t插入時間:% s \ n ",L-& gt;基數[i]。不,我-& gt;基數[i]。名稱,Stmp,L-& gt;基數[i]。年齡,L-& gt;基數[i]。電話,L-& gt;基數[i]。insert time);

}

退貨OK;

}

狀態打印元素(元素指針元素)

{

char Stmp[7];

printf(" \ nPrintElem:\ n ");

if(elem-& gt;性別==男性)

strcpy(Stmp,“男”);

else if(elem-& gt;性別==女性)

strcpy(Stmp,“女”);

其他

strcpy(Stmp," Unknow ");

printf(" NO:% d \ t name:% s \ t \ tSex:% s \ tAge:% d \ n \ t tel:%s\n \ t插入時間:% s \ n ",elem-& gt;不,elem-& gt;名稱,Stmp,elem-& gt;年齡,elem-& gt;Tel,elem-& gt;insert time);

退貨OK;

}

Void main() //把上面的函數都串起來。

{

SqList TheList

SqPointer ListP

ElemType mylistelem,* elemtemp

ElemPointer mylist

int I;

char nameT[20];

elemtemp = & ampmylistelem//*ret

ListP = & ampTheList

if(InitList(ListP)= = OK)puts(" InitList(the list)= = OK ");

PrintListProperty(ListP);

if(list empty(ListP)= = TRUE)puts(" list empty = = TRUE ");

else puts(" list empty = = False ");

ScanfList(ListP,1);

PrintListProperty(ListP);

print screen(ListP);

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

puts("\nGetElem index?");

scanf("%d ",& ampI);

if(GetElem(ListP,I,elem temp)= = OK)print elem(elem temp);

puts("\nLocateElem名稱?");

scanf("%s ",nameT);

printf("LocateElem return %d . ",LocateElem(ListP,nameT));

puts("\nListDelete index?");

scanf("%d ",& ampI);

if(ListDelete(ListP,I,elem temp)= = OK)print elem(elem temp);

puts("\nListInsert index?");

scanf("%d ",& ampI);

puts("\nListInsert NEWELEM?");

ListInsert(ListP,I,ScanfElem());

PrintListProperty(ListP);

print screen(ListP);

if(clear list(ListP)= = OK)puts(" clear list = = OK ");

if(list empty(ListP)= = TRUE)puts(" list empty = = TRUE ");

if(DestroyList(ListP)= = OK)puts(" DestroyList = = OK ");

getch();

}

/*功能列表

類型名稱參數描述

Int ErrorEXP (int i)錯誤描述符

初始化SQL指針...並通過l返回基地。

當狀態增加列表(SQL pointer l)l已滿時,繼續申請空間。

狀態銷毀列表(SQL指針)

status clear list(SQL pointer L)將L設置為空表。

boolen list empty(SQL pointer L)判斷L是否為空表,如果是則返回TRUE。

int ListElemCount(SQL pointer L)返回當前L中記錄的元素個數。

status get elem(SQL pointer l,int i,elemtype *ret)返回元素I到*ret。

int locate Elem(SQL pointer L,Charlocate name [])按順序查找表,根據name字段返回第壹個匹配元素的I,否則返回0。

status list insert(SQL pointer l,int i,elemtype newelem)在l中的位置I插入新的elem元素。

狀態列表delete(SQL pointer L,int i,elementtype *ret)刪除L中的第I個元素並用*ret返回。

狀態尹柯列表(SQPointer L,int I)從鍵盤輸入壹個元素,並將其插入位置I

ElemType ScanfElem()從鍵盤輸入的單個元素中返回ElemType類型的節點。

狀態掃描列表(sq指針L,int I)從編號開始按升序將元素輸入到LI直到按下“ESC”鍵。

status printlistproperty(SQL pointer l)打印l的屬性,打印格式為(已用空間/應用空間基址內存占用)。

status print screen(SQL pointer L)將整個L表打印到屏幕上。

打印Elem類型的單個元素。

時間很匆忙,所以有點亂。書中第二章開頭的動態線性序列表的基本操作幾乎都寫了。

我不知道妳是不是在說這個。mian函數比較亂,但是基本操作都串在壹起了。妳們

可以根據情況改變主函數的調用過程,如何實現會更清晰。可以按F10。

單次跟蹤,F11可以進入調用流程,只需按程序壹步壹步操作即可。

之前寫過壹個關於動態鏈表的,好像給妳看過。我會把它附在這裏寄給妳。文件鏈接列表. c

只實現了構造鏈表並打印出來的功能。

*/