首なし一方向非循環チェーンの添削を実現しました.
3508 ワード
無頭一方向の非循環チェーン表:
構造は簡単で、普通は単独でデータを保存するために使われません.
実際には、ハッシュ・テーブル、図のリードなど、他のデータ構造のサブ構造としてのものが多い.
次に、無頭一方向の非循環チェーンの添削を見てみます.
SList.h(関数宣言)
構造は簡単で、普通は単独でデータを保存するために使われません.
実際には、ハッシュ・テーブル、図のリードなど、他のデータ構造のサブ構造としてのものが多い.
次に、無頭一方向の非循環チェーンの添削を見てみます.
SList.h(関数宣言)
#ifndef _SLIST_H_
#define _SLIST_H_
#include
#include
#include
#include
//
typedef int SLTDataType;
typedef struct SListNode{
SLTDataType data;
struct SListNode*next;
}SListNode;
typedef struct SList{
SListNode* head;
}SList;
void SListInit(SList* plist);
void SListDestory(SList* plist);
SListNode* BuySListNode(SLTDataType x);
void SListPushFront(SList* plist, SLTDataType x);
void SListPopFront(SList* plist);
SListNode* SListFind(SList* plist, SLTDataType x);
// pos
void SListInsertAfter(SList* pos, SLTDataType x);
void SListEraseAfter(SList* pos);
void SListRemove(SList* plist, SLTDataType x);
void SListPrint(SList* plist);
#endif/*_SLIST_H_*/
SList.c(関数実装)#include"SList.h"
#include
SListNode* BuySListNode(SLTDataType x)//
{
SListNode* res =
res = (SListNode*)malloc(sizeof(SListNode));
if (res == NULL)
{
printf(" ");
return NULL;
}
res->data = x;
res->next = NULL;
return res;
}
void SListInit(SList* plist)
{
plist->head=NULL;
}
void SListPushFront(SList* plist, SLTDataType x)//
{
SListNode* tmp = BuySListNode(x);
if (tmp != NULL)
{
tmp->next = plist->head;
plist->head = tmp;
}
}
void SListPopFront(SList* plist)//
{
if (NULL != plist->head)
{
SListNode* pt = plist->head;
plist->head = pt->next;
free(pt);
}
}
void SListInsertAfter(SListNode* pos, SLTDataType x)
{
SListNode* tmp = BuySListNode(x);
tmp->next = pos->next;
pos->next = tmp;
}
void SListEraseAfter(SListNode* pos)// pos+1
{
SListNode* tmp = pos->next;
pos->next = pos->next->next;
free(tmp);
}
SListNode* SListFind(SList* plist, SLTDataType x)//
{
SListNode* tmp=plist->head;
while (tmp!= NULL)
{
if (tmp->data == x)
return tmp;
else
tmp = tmp->next;
}
return NULL;
}
void SListRemove(SList* plist, SLTDataType x)// x
{
while (plist->head != NULL&&plist->head->data == x)
{
SListPopFront(plist);
}
if (plist->head == NULL)
{
return;
}
SListNode* ph = plist->head;
SListNode* pt = ph->next;
while (NULL != pt)
{
if (pt->data == x)
{
pt = pt->next;
SListEraseAfter(ph);
ph->next = pt;
continue;
}
pt = pt->next;
ph = ph->next;
}
}
void SListPrint(SList* plist)
{
SListNode* pt = plist->head;
while (NULL != pt)
{
printf("%d->", pt->data);
pt = pt->next;
}
printf("
");
}
void SListDestory(SList* plist)
{
if (plist->head != NULL)
{
SListNode*pt = plist->head;
while (pt!=NULL)
{
SListNode* t=pt;
pt = pt->next;
free(t);
}
plist->head = NULL;
}
}
mail.c(テスト関数)#include"SList.h"
int main()
{
SList test;
SListInit(&test);
SListPushFront(&test, 1);
SListPushFront(&test, 2);
SListPushFront(&test, 3);
SListNode* tmp = test.head->next->next;
SListInsertAfter(tmp, 4);
SListInsertAfter(tmp, 4);
SListInsertAfter(tmp, 5);
SListInsertAfter(tmp, 6);
//
SListPrint(&test);
SListRemove(&test, 6);
SListPrint(&test);
//
SListDestory(&test);
system("pause");
return 0;
}