最近では何かが、数時間後に痛みで、それはいくつかの痛みのときリストで学ぶために始めて、データ構造の知識を検討している、最終的に何かを得ることを、コンピュータ、このレコードを見て準備します
プロパティリスト----
①:ポインタを介して隣接する素子間の接続。
②:NULLへの最後の要素の後継ポインタ。
③:スペースリストは必要に応じて割り当てることができます。
④:無駄なメモリ空間を。
単独リンクリスト
一般的に複数のノードを含む、単独でリンクされたリストを参照し、各ノードは、後続(次)ポインタの次の要素へのポインタを有しています。次の表は、最後のノードは、リストの終わりを示す、NULLです。
実装の単純なリスト:
ノードを生成するために使用される構造体の定義:
typedef struct node
{
int date;
struct node *next;
}Node;
構造体ノードタイプの代わりに使用される後続の手順で、構造を定義する構造体ノードノード(簡単な変更及び操作に)起こります。
第1ノードと尾ノードのリストを格納するために使用される構造体の定義:
typedef struct node
{
Node *head;
Node *tail;
}LNode;
この構造は、二つのノードに格納される(アドレス!!!!)直接ではなく、彼の値に!!
1元のオリジナルリスト生成(空のリストを、任意のノードへのポイントが存在しません)
LNode *createlist()
{
LNode *list=(LNode *)malloc(sizeof(*list));
list->head=NULL;
list->tail=NULL;
return list;
}
ノートポインタ戻り値の型と関数型で、元の呼び出し元の関数に返される新しいリストを生成します。
元のリストに割り当てられています:
void crea(LNode *list)
{
while(1)
{
int i;
scanf("%d",&i);
if(i==100)
{
break;
}
//生成孤立结点
Node *pnew=(Node *)malloc(sizeof(*pnew)); //注意这里要在while()里面定义和分配空间!!!
pnew->next=NULL; //因为每添加一个新结点就需要多增加一块存储空间!!!
pnew->date=i; //这里错 1 次!!
//判断链表是否为空链表,是空链表就让链表的头和尾都指向孤立结点
if(list->head==NULL)//注意不能直接用head!!! //这里错 1 次!!
{
list->head=pnew;
list->tail=pnew;
}
else //不是孤立结点就插入结点生成链表
{
list->tail->next=pnew; //尾插法;1.让原链表的next指向新结点,
//使新结点成为原链表尾结点的下一个结点;
list->tail=pnew; //2.让原链表的尾结点指向新结点,更新尾结点的位置;
// pnew->next=list->head; //头插法:1.让新结点的next指向原链表的头结点;
// list->head=pnew; //2.让原链表的头结点指向新结点,更新头结点的位置;
}
}
}
リストを印刷します:
void print(LNode *list)
{
if(list->head==NULL) //若链表为空,直接退出
{
return ;
}
Node *p=list->head; //注意这里p指向的是链表的头结点,p的类型是结点型的!!不是链表型的。
while(p)
{
printf("%d ",p->date);
p=p->next; //对结点进行操作!!
}
printf("\n");
}
2).打印并销毁链表
void print(LNode *list)
{
if(list->head==NULL) //若链表为空,直接退出
{
return ;
}
Node *p=list->head; //用来指向要打印的结点
Node *pre=NULL; //用来指向打印完的结点
while(p)
{
printf("%d ",p->date);
pre=p; //指向打印完的结点
p=p->next;
free(pre); //销毁打印完的结点(释放其所占空间),即逐渐销毁链表所有的结点。
}
printf("\n");
free(list); //把空链表也销毁
}
質問があれば、指摘してください
私たちが一緒に進行することを