資料結構_單鏈表(帶頭節點)
阿新 • • 發佈:2019-01-31
單鏈表(以帶頭節點的單鏈表為例)的表示圖如下:
1. 定義單鏈表結構,結構體中包括 data 資料域和 next 指標域,程式碼如下:
typedef struct Node
{
int data;//資料域
struct Node *next;//指向下一個節點
}Node,*List;//List == Node*
2. 單鏈表的初始化,程式碼如下:
void InitList(List plist)
{
assert(plist != NULL);
plist->next = NULL;
//plist->data不用操作
}
3. 利用頭插法進行插入,程式碼如下:
bool Insert_Head(List plist,int val) { Node *p = (Node *)malloc(sizeof(Node)); p->data = val; p->next = plist->next; plist->next = p; return true; }
4. 利用尾插法進行插入,程式碼如下:
bool Insert_Tail(List plist,int val)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = val;
Node *q;
for(q=plist;q->next!=NULL;q=q->next) ;
//將p插入在q的後面
p->next = q->next;
q->next = p;
return true;
}
5. 按照關鍵字進行查詢,程式碼如下:
Node *Search(List plist,int key) { for(Node *p=plist->next;p!=NULL;p=p->next) { if(p->data == key) { return p; } } return NULL; }
6. 查詢關鍵字 key 的前驅,程式碼如下:
static Node *SearchPri(List plist,int key)
{
for(Node *p=plist;p->next!=NULL;p=p->next)
{
if(p->next->data == key)
{
return p;
}
}
return NULL;
}
7. 按照關鍵字進行刪除,程式碼如下:
bool Delete(List plist,int key) { Node *p = SearchPri(plist,key); if(p == NULL) { return false; } Node *q = p->next; p->next = q->next;//將q從連結串列中剔除 free(q); return true; }
8. 判空,程式碼如下:
bool IsEmpty(List plist)
{
return plist->next == NULL;
}
9. 求單鏈表的長度,程式碼如下:
int GetLength(List plist)
{
int count = 0;
for(Node *p=plist->next;p!=NULL;p=p->next)
{
count++;
}
return count;
}
10. 列印單鏈表,程式碼如下:
void Show(List plist)
{
for(Node *p=plist->next;p!=NULL;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
}
11. 清楚單鏈表,程式碼如下:
void Clear(List plist)
{
Destroy(plist);
}
12. 摧毀單鏈表,程式碼如下:
void Destroy(List plist)
{
Node *p;
while(plist->next != NULL)//刪除第一個資料節點
{
p = plist->next;
plist->next = p->next;
free(p);
}
/*
Node *p = plist->next;
}
13. 單鏈表逆置,程式碼如下:
void Revers(List plist)
{
//頭插的思想
if(plist==NULL || plist->next==NULL ||
plist->next->next==NULL)
{
return ;
}
Node *p = plist->next;
Node *q;
plist->next = NULL;//
while(p != NULL)
{
q = p->next;
//將p頭插進連結串列
p->next = plist->next;
plist->next = p;
p = q;
}
}