赞
踩
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表
中的指针链接次序实现的 ,逻辑上是连续的,有顺序的。
实际中要实现的链表的结构非常多样,以下情况组合起来就有8种链表结构:
- 单向、双向
- 带头、不带头
- 循环、非循环
单链表的英文是:Single Linked List(简称:SL,区别于顺序表的 SeqList 或 SQL)
typedef int SLTDataType;
struct SListNode
{
SLTDataType data;//int data;
struct SListNode* next;//为结构体指针,是指针,不是结构体,结构体里面不可嵌套结构体
};
typedef struct SListNode SLTNode;
void SListPrint(SLTNode* phead) //头结点:phead,plist表示 { SLTNode* cur = phead; while (cur != NULL) { printf("%d->", cur->data);//data数据域 cur = cur->next; //next指向指针域 } printf("NULL\n"); } SLTNode* BuySListNode(SLTDataType x) { SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); newnode->data = x; newnode->next = NULL; return newnode; }
//尾插单链表 void SListPushBack(SLTNode** pphead, SLTDataType x)//传二级指针,不然为形参,不改变 { SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); newnode->data = x; newnode->next = NULL; if (*pphead == NULL) { *pphead = newnode; //newnode:尾插的元素数 } else { SLTNode* tail = *pphead; while (tail->next != NULL) //尾指针:tail表示 { tail = tail->next; } tail->next = newnode; } }
//头插单链表
void SListPushFront(SLTNode** pphead, SLTDataType x)
{
SLTNode* newnode = BuySListNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
//头删单链表 PopFront
void SListPopFront(SLTNode** pphead)
{
SLTNode* next = (*pphead)->next;
free(*pphead);
*pphead = next;
}
//尾删单链表 PopBack //1.链表为空 //2.只有一个结点 //3.至少有两个结点(正常情况) void SListPopBack(SLTNode** pphead) { if (*pphead = NULL) { return; } else if((*pphead)->next=NULL) { free(*pphead); *pphead = NULL; } else { SLTNode* prev = NULL; SLTNode* tail = *pphead; while (tail->next != NULL) { prev = tail; tail = tail->next; } free(tail); prev->next = NULL; } }
//找x Find
SLTNode* SListFind(SLTNode* pphead, SLTDataType x)
{
SLTNode* cur = pphead;
while (cur)
{
if (cur->data == x)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
//在pos前面插入x Insert void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) { if (pos == *pphead) { SListPushFront(pphead, x); } else { SLTNode* newnode = BuySListNode(x);; SLTNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } prev->next = newnode; newnode->next = pos; } }
void SListErase(SLTNode** pphead, SLTNode* pos)//删除pos位置的值 //1.删的为头指针 //2.其他正常情况 { if (pos == *pphead) { SListPopFront(pphead); } else { SLTNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } prev->next = pos->next; free(pos); } }
//销毁单链表
void SListDestory(SLTNode** pphead)
{
assert(pphead);
SLTNode* cur = *pphead;
while (cur)
{
SLTNode* next = cur->next;
free(cur);
cur = next;
}
*pphead = NULL;
}
#pragma once//防止重复定义头文件 #include<stdio.h> #include<stdlib.h> typedef int SLTDataType; struct SListNode { SLTDataType data;//int data; struct SListNode* next;//为结构体指针,是指针,不是结构体,结构体里面不可嵌套结构体 }; typedef struct SListNode SLTNode; //不会改变链表的头指针,传一级指针 void SListPrint(SLTNode* phead);//打印 //可能会改变链表的头指针,传二级指针 void SListPushBack(SLTNode** pphead,SLTDataType x);//尾插 void SListPushFront(SLTNode** pphead, SLTDataType x);//头插 void SListPopBack(SLTNode** pphead);//尾删 void SListPopFront(SLTNode** pphead);//头删 SLTNode* SListFind(SLTNode** pphead, SLTDataType x);//找x void SListInsert(SLTNode** pphead,SLTNode* pos, SLTDataType x);//在pos前面插入x void SListErase(SLTNode** pphead, SLTNode* pos);//删除pos位置的值 void SListDestory(SLTNode** pphead);//销毁单链表
#include"SList.h" //打印单链表 void SListPrint(SLTNode* phead) //头结点:phead,plist表示 { SLTNode* cur = phead; while (cur != NULL) { printf("%d->", cur->data);//data数据域 cur = cur->next; //next指向指针域 } printf("NULL\n"); } SLTNode* BuySListNode(SLTDataType x) { SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); newnode->data = x; newnode->next = NULL; return newnode; } //尾插单链表 void SListPushBack(SLTNode** pphead, SLTDataType x)//传二级指针,不然为形参,不改变 { SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); newnode->data = x; newnode->next = NULL; if (*pphead == NULL) { *pphead = newnode; //newnode:尾插的元素数 } else { SLTNode* tail = *pphead; while (tail->next != NULL) //尾指针:tail表示 { tail = tail->next; } tail->next = newnode; } } //头插单链表 void SListPushFront(SLTNode** pphead, SLTDataType x) { SLTNode* newnode = BuySListNode(x); newnode->next = *pphead; *pphead = newnode; } //头删单链表 PopFront void SListPopFront(SLTNode** pphead) { SLTNode* next = (*pphead)->next; free(*pphead); *pphead = next; } //尾删单链表 PopBack //1.链表为空 //2.只有一个结点 //3.至少有两个结点(正常情况) void SListPopBack(SLTNode** pphead) { if (*pphead = NULL) { return; } else if((*pphead)->next=NULL) { free(*pphead); *pphead = NULL; } else { SLTNode* prev = NULL; SLTNode* tail = *pphead; while (tail->next != NULL) { prev = tail; tail = tail->next; } free(tail); prev->next = NULL; } } //找x Find SLTNode* SListFind(SLTNode* pphead, SLTDataType x) { SLTNode* cur = pphead; while (cur) { if (cur->data == x) { return cur; } cur = cur->next; } return NULL; } //在pos前面插入x Insert void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) { if (pos == *pphead) { SListPushFront(pphead, x); } else { SLTNode* newnode = BuySListNode(x);; SLTNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } prev->next = newnode; newnode->next = pos; } } void SListErase(SLTNode** pphead, SLTNode* pos)//删除pos位置的值 //1.删的为头指针 //2.其他正常情况 { if (pos == *pphead) { SListPopFront(pphead); } else { SLTNode* prev = *pphead; while (prev->next != pos) { prev = prev->next; } prev->next = pos->next; free(pos); } } //销毁单链表 void SListDestory(SLTNode** pphead) { assert(pphead); SLTNode* cur = *pphead; while (cur) { SLTNode* next = cur->next; free(cur); cur = next; } *pphead = NULL; }
#include "SList.h" //尾插 void TestSList1() { SLTNode* plist = NULL; SListPushBack(&plist, 1); SListPushBack(&plist, 2); SListPushBack(&plist, 3); SListPushBack(&plist, 4); SListPushFront(&plist,0); SListPrint(plist); SListPopFront(&plist); SListPopFront(&plist); SListPopFront(&plist); SListPrint(plist); SListPopFront(&plist); SListPrint(plist); } void TestSList3() { SLTNode* plist = NULL; SListPushBack(&plist, 1); SListPushBack(&plist, 2); SListPushBack(&plist, 3); SListPushBack(&plist, 4); SListPrint(plist); // 想在1的前面插入一个10 SLTNode* pos = SListFind(plist, 1); if (pos) { SListInsert(&plist, pos, 10); } SListPrint(plist); //想在3的前面插入一个30 pos = SListFind(plist, 3); if (pos) { SListInsert(&plist, pos, 30); } SListPrint(plist); } void TestSList4() { SLTNode* plist = NULL; SListPushBack(&plist, 1); SListPushBack(&plist, 2); SListPushBack(&plist, 3); SListPushBack(&plist, 4); SListPrint(plist); SLTNode* pos = SListFind(plist, 1);//删除1 if (pos) { SListErase(&plist, pos); } SListPrint(plist); pos = SListFind(plist, 4);//删除4 if (pos) { SListErase(&plist, pos); } SListPrint(plist); pos = SListFind(plist, 2);//删除2 if (pos) { SListErase(&plist, pos); } SListPrint(plist); } int main() { TestSList4(); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。