《資料結構與演算法》-單鏈表基本操作的C語言實現
阿新 • • 發佈:2019-02-12
最近在學演算法內容,發現很多演算法依賴於基本的資料結構,所以從新溫習資料結構,記錄一下,以後知識點忘記可以提醒自己哪裡比較容易出錯。
所用教材《資料結構與演算法分析》by Mark Allen Weiss
《資料結構》(C語言版) by嚴蔚敏
#include <stdio.h>
#include <stdlib.h>
#include "List.h"
//首先一些預定義:
struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode List ;
typedef PtrToNode Position;
//定義一個結構體,表示一個結點
struct Node{
ElementType Element;
Position Next;//Position表示strut Node*;
};
/*
*測試一個連結串列是否為空的函式
*返回true為空,false非空
*/
int IsEmpty(List L)
{
return L->Next==NULL;
}
/*
*測試當前位置是否為連結串列的末尾
*返回true表示是末尾,false表示不是末尾
*/
int IsLast(Position P,List L)
{
return P->Next==NULL;
}
/*
*返回某個元素在表中的位置
*返回NULL表示沒找到
*/
Position Find(ElementType X,List L)
{
Position P;
P=L->Next;
while(P!=NULL&&P->Element!=X)
P=P->Next;
return P;
}
/*
*函式名 : CreateList()
*函式功能描述 : 創造一個n(不包括頭結點)個結點的單鏈表
*函式引數 : List L單鏈表頭結點 int n節點個數
*函式返回值 :void
*作者 : Tengyuan
*函式建立日期 : 2016.3.10
*備註:宣告一個指向結構的指標並不建立該結構,只是預留了儲存空間;而malloc函式會建立結構並返回指向該結構的指標。
*/
void CreateList(List L,int n)
{
int i;
for(i=0;i<n;++i)
{
List P=(List)malloc(sizeof(struct Node));
P->Next=NULL;
scanf("%d",&(P->Element));
L->Next=P;//把結點P接到連結串列L後面
L=P;//此時連結串列從P後面接入結點
}
}
/*
*列印連結串列中的元素
*/
void ListPrint(List L)
{
struct Node *P=L->Next;
while(P!=NULL)
{
printf("%3d",P->Element);
P=P->Next;
}
}
/*
*返回元素X在L中前驅位置
*/
Position FindPrevious(ElementType X,List L)
{
Position P;
P=L;
while(P->Next!=NULL && P->Next->Element!=X)
{
P=P->Next;
}
return P;
}
void Delete(ElementType X,List L)
{
Position P,Ptr;
// P=FindPrevious(X,L);//刪除第一次出現的X值
// if(!IsLast(P,L))
// {
// Ptr=P->Next;
// P->Next=Ptr->Next;
// free(Ptr);
// }
P=FindPrevious(X,L);//刪除所有出現的X值
while(!IsLast(P,L))
{
Ptr=P->Next;
P->Next=Ptr->Next;
free(Ptr);
P=FindPrevious(X,L);
}
}
//在表L中位置P後插入元素X
void Insert(ElementType X,List L,Position P)
{
Position TmpCell;
TmpCell=malloc(sizeof(struct Node));
if(TmpCell==NULL)
printf("Out of space!!!");
TmpCell->Element=X;
TmpCell->Next=P->Next;
P->Next=TmpCell;
}
int main()
{
List L;
L=(List)malloc(sizeof(struct Node));//必須創造一個空間儲存節點L,單獨一個List L並沒有建立頭結點
L->Next=NULL;
CreateList(L,4);
ListPrint(L);
printf("\n");
Delete(5,L);
ListPrint(L);
printf("\n");
Insert(12,L,L->Next->Next);
ListPrint(L);
printf("\n");
return 0;
}