㈠ 詳解順序表
順序表是一種線性表的實現方式,它採用一組地址連續的存儲單位存儲數據元素,實現邏輯上相鄰元素的物理相鄰。順序表通常利用數組實現,支持增刪查改操作。順序表分為靜態和動態兩種形式。
順序表運算包括初始化、插入、刪除、查找。初始化將所有元素設為0或空字元。插入將新元素放置於指定位置,調整數組長度。刪除元素並更新長度。查找元素位置或返回未找到信息。
順序表實現包含定義結構、表長度、數組,初始化函數,插入、刪除函數,長度及容量判斷,顯示數組中元素的函數,以及主函數和執行結果。
通過一個C程序,演示了順序表操作方法。盡管存在不足,但期望在後續學習中,通過季老師的指導,掌握更多數據結構知識。加油!
參考文獻:
[1]李剛、劉萬輝「數據結構(C語言)」
[2]網路
[3]CSDN中各位大佬博主
㈡ 如何用C語言做到增刪改查 內詳
很早前幫朋友寫的,跟你的需求很像,給你用吧。
你可改下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
只實現了構造鏈表,並列印出來的功能。
*/
㈢ linux增刪改查命令
linux增刪改查命令有哪些?讓我們一起來了解下。
1、增:touch命令是最常用的創建文件的命令。
語法:touch [-acfm][-d日期時間][-r參考文件或目錄] [-t日期時間][--help][--version][文件或目錄…]
參考例子:
使用touch指令,創建一個新的空白文件。
$ touch file #創建一個名為「file」的新的空白文件
參數:
a 改變檔案的讀取時間記錄。
m 改變檔案的修改時間記錄。
c 假如目的檔案不存在,不會建立新的檔案。與 --no-create 的效果一樣。
f 不使用,是為了與其他 unix 系統的相容性而保留。
r 使用參考檔的時間記錄,與 --file 的效果一樣。
d 設定時間與日期,可以使用各種不同的格式。
t 設定檔案的時間記錄,格式與 date 指令相同。
2、刪:rm命令是最常用於刪除的命令。
語法:rm [options] name...
參考例子:
刪除當前目錄下的所有文件及目錄,命令行為:
rm -r *
參數:
-i 刪除前逐一詢問確認。
-f 即使原檔案屬性設為唯讀,亦直接刪除,無需逐一確認。
-r 將目錄及以下之檔案亦逐一刪除。
3、改:mv命令最常用於修改的命令。
語法:
mv [options] source dest
mv [options] source... directory
參考例子:
將文件 aaa 改名為 bbb :
mv aaa bbb
參數:
-b: 當目標文件或目錄存在時,在執行覆蓋前,會為其創建一個備份。
-i: 如果指定移動的源目錄或文件與目標的目錄或文件同名,則會先詢問是否覆蓋舊文件,輸入 y 表示直接覆蓋,輸入 n 表示取消該操作。
-f: 如果指定移動的源目錄或文件與目標的目錄或文件同名,不會詢問,直接覆蓋舊文件。
-n: 不要覆蓋任何已存在的文件或目錄。
-u:當源文件比目標文件新或者目標文件不存在時,才執行移動操作。
4、查:head命令最常用來查找的命令。
語法:head [參數] [文件]
參考例子:
顯示文件前 20 個位元組:
head -c 20 runoob_notes.log
參數:
-q 隱藏文件名
-v 顯示文件名
-c數目 顯示的位元組數。
-n行數 顯示的行數。
今天的分享就是這些,希望能幫助大家。