リンクリスト:
1)リンクリストの分類:
ヘッダー:ポインターフィールドのみ
ノード:ポインタフィールド+データフィールドポインタフィールドは次のノードのデータフィールドを指し、ポインタフィールドは次のノードの最初のアドレス、つまりptemp-> next = pnewです。
テーブルテール:ポインタフィールド+データフィールド、ポインタフィールドはNULを指します
2)リンクリストはチェーンストレージ構造であり、必ずしも空間的に連続しているとは限りません。
2つのコードセグメントを理解します。(1)ptemp = ptemp-> next //次のノード操作に進みます
(2)ptemp-> next = pnew; //現在のノードポインタフィールドは次のノードを指します(もちろん、前のノードアドレスも保存できます)
ノードの作成---リンクリストの作成---ノードの削除---ノードの挿入---ノードのクエリ---ノードの変更
1.構造構造
typedef struct student
{
int ID;
char name[10];
float score;
struct student *pnext
}STD;
2.ノードを作成します
STD *Creat_node(void)
{
STD *pnew = (STD *)malloc(sizeof(STD));
pnew->pnext = NULL;
return pnew;
}
3.リンクリストを作成します
STD *Creat_link(int num)
{
STD *phead;
STD *pnew,*pb;
phead = NULL;
for(int i = 0;i <= num;i++)
{
pnew = Creat_node();
if(i == 0 )
{
phead = pnew;
}
else
{
pb->pnext = pnew;
}
pb = pnew;
}
if(phead != NULL)
{
pb->pnext = NULL;
}
return phead;
}
4.ノードを削除します
int Delete_node(STD *phead,int ID)
{
STD *ptemp = phead;
STD *pdelete = NULL;
if(phead == NULL)
{
perror("要查询的链表为空");
}
while(ptemp->pnext != NULL)
{
if(ptemp->pnext->id == ID)
{
pdelete = ptemp->pnext;
ptemp=>pnext = pdelete->pnext;
free(pdelete);
return 1;
}
ptemp = ptemp->pnext;
}
return 0;
}
5.ノードを挿入します
STD *Insert_node(STD *phead,STD *pnew)
{
STD *ptemp = phead;
if(ptemp == NULL)
{
perror("Insert 链表为空");
exit(0);
}
while(ptemp->pnext != NULL)
{
ptemp=ptemp->pnext;
}
ptemp->pnext = pnew;
return ptemp;
}
6.クエリノード
STD *SEEK_node(STD *phead,int id)
{
STD *ptemp = phead;
STD *pseek = NULL;
while(ptemp->pnext != NULL)
{
if(ptemp->pnext->id == ID)
{
pseek = ptemp->pnext;
return pseek;
}
ptemp = ptemp->pnext;
}
return 0;
}
7.ノードを変更します
int *Change_node(STD *phead,STD ptemp)
{
STD *pseek = SEEK_node(phead,ptemp.id);
pseek->id = std.id;
strcpy(pseek->name,std.name);
pseek->score = std.score;
return 1;
}
2)一般的に使用される機能のリンクリスト
(1)malloc
関数プロトタイプ:void * _Cdecl malloc(size_t size);
機能機能:メモリからメモリスペースを申請します(手動で開きます。ヒープ領域から開きます。スペースを解放しない限り、保存されたデータはメインエンドが自動的にスペースを解放するまで常に存在します)
使用:p = malloc(8); // 8バイトのスペースをメモリに適用します。成功した場合、アプリケーション後のスペースの最初のアドレスがpに保存されます。
(2)calloc
関数プロトタイプ:void * _Cdecl calloc(size_t nitems、size_t size);
機能機能:メモリから複数のメモリスペースに適用します
使用法:例:p = calloc(3,4);成功:開かれた最初のスペースの最初のアドレスを返し、失敗した場合はNULLを返します
(3)realloc
関数プロトタイプ:void * _Cdecl realloc(void * block、size_t size);
関数function:割り当てられたメモリスペースのサイズを変更します
関数パラメータ:ブロック:変更が必要なメモリスペースの最初のアドレスを示しますサイズ:変更するメモリスペースの量
関数の戻り値:成功:新しいスペースの最初のアドレスを返します。失敗:NULL
例:p = realloc(q、20); //メモリに適用してスペースのバイトサイズを変更し、20バイトに変更してから、新しいスペースの最初のアドレスをpに割り当てます。
注:元のスペースにデータがある場合、新しいスペースが元のスペースよりも小さいと、データが失われます。
(4)無料
関数プロトタイプ:void _Cdecl free(void * block);
機能機能:メモリに動的に開かれたスペースを手動で解放します
関数パラメーター:解放されるスペースの最初のアドレス
関数の戻り値:なし
一時的な手書きの記事を書くための手順は検証されておらず、異なる場合があります!