单链表
1.单链表基本数据类型
typedef int SLTDataType;
//单链表
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;
}SLTNode;
2.创建单链表结点
动态分配一个结构体空间,并返回空间地址。
SLTNode* BuySListNode(SLTDataType x)//创建结点
{
SLTNode* new = (SLTNode*)malloc(sizeof(SLTNode));
if (new == NULL)
{
printf("malloc fail\n");
exit(-1);
}
new->next = NULL;
new->data = x;
return new;
}
3.打印链表
void SListPrint(SLTNode* phead)
{
SLTNode* cur=phead;
while(cur)
{
printf("%d->",cur->data);
cur=cur->next;
}
printf("null\n");
}
4.尾部插入结点
void SListPushBack(SLTNode** pphead, SLTDataType x)
{
//首先创建结点
SLTNode *new=BuySListNode(x);
//插入到链表的尾部
//需要考虑pphead是否为空,如果为空需要改变*pphead,
//这里也是以二级指针作为形参的原因
if(*pphead==NULL)
{
*pphead=new;
}
else
{
SLTNode* tail=*pphead;
while(tail->next)
{
tail=tail->next;
}
tail->next=new;
}
}
5.删除尾部结点
void SListPopBack(SLTNode** pphead)
{
assert(*pphead);
if((*pphead)->next==NULL)//仅剩一个结点
{
free(*pphead);
*pphead=NULL;
}
else
{
SLTNode* tail=*pphead;
while(tail->next->next)
{
tail=tail->next;
}
free(tail->next);
}
}
6.头部插入结点
void SListPushFront(SLTNode** pphead, SLTDataType x)
{
SLTNode* new = BuySListNode(x);
new->next = *pphead;
*pphead = new;
}
7.删除头部节点
void SListPopFront(SLTNode** pphead)
{
assert(*pphead);
SLTNode* cur = (*pphead)->next;
free(*pphead);
(*pphead) = cur;
}
8.寻找结点
返回结点所在地址
SLTNode* SListFind(SLTNode* phead, SLTDataType x)//返回x所在指针
{
SLTNode* cur = phead;
while (cur)
{
if (cur->data == x)
{
return cur;
}
else
{
cur = cur->next;
}
}
return NULL;//找不到返回NULL
}
9.在指定位置之前插入结点
//在pos前插入x
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
//创建一个空结点
SLTNode* new = BuySListNode(x);
//如果pos为头结点 则头插
if (pos == *pphead)
{
new->next = *pphead;
*pphead = new;
}
else
{
SLTNode* prepos = *pphead;
while (prepos->next != pos)//如果pos为NULL则直接插在尾部
{
prepos = prepos->next;
}
prepos->next = new;
new->next = pos;
}
}
10.在指定位置之后插入结点
//在pos之后插入
void SListInsertAfter(SLTNode* pos, SLTDataType x)
{
assert(pos);
SLTNode* new = BuySListNode(x);
new->next = pos->next;
pos->next = new;
}
11.删除指定位置的结点
void SListErase(SLTNode** pphead, SLTNode* pos)//删除在pos位置处的结点
{
assert(*pphead);
assert(pos);
if((*pphead)==pos)
{
*pphead=(*pphead)->next;
}
else
{
SLTNode* prepos = *pphead;
while (prepos->next != pos)
{
prepos = prepos->next;
}
prepos->next = pos->next;
}
free(pos);
pos = NULL;
}
12.销毁链表
void SListDestroy(SLTNode** pphead)//销毁单链表
{
assert(*pphead);
else
{
SLTNode* cur=*pphead;
while (cur)
{
SLTNode* next;
next = cur->next;
free(cur);
cur=next;
}
*pphead = NULL;
}
}
13.实操
void testlist1()
{
SLTNode* plist = NULL;
//尾插 3 1 5
printf("尾插 3 1 5\n");
SListPushBack(&plist, 3);
SListPushBack(&plist, 1);
SListPushBack(&plist, 5);
SListPrint(plist);
//头插 2 1
printf("头插 2 1\n");
SListPushFront(&plist, 2);
SListPushFront(&plist, 1);
SListPrint(plist);
SLTNode* pos = plist;
int i = 1;
do
{
pos = SListFind(pos, 1);
if (pos == NULL)
{
break;
}
printf("第%d个1的地址为%p:", i, pos);
printf("\n");
pos = pos->next;
i++;
} while (pos);
pos = SListFind(plist, 3);//找到3的位置
//在3之前插入30
printf("在3之前插入30\n");
SListInsert(&plist, pos, 30);
SListPrint(plist);
//找到5 并删除
printf("找到5 并删除\n");
pos = SListFind(plist, 5);
SListErase(&plist, pos);
SListPrint(plist);
SListDestroy(&plist);
SListPrint(plist);
}
//主函数
int main()
{
testlist1();
return 0;
}
今天正好是1024,暂且祝自己节日快乐吧!
青山不改 绿水长流