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);
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)
{
SLTNode* cur = phead;
while (cur)
{
if (cur->data == x)
{
return cur;
}
else
{
cur = cur->next;
}
}
return NULL;
}
9.在指定位置之前插入结点
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
SLTNode* new = BuySListNode(x);
if (pos == *pphead)
{
new->next = *pphead;
*pphead = new;
}
else
{
SLTNode* prepos = *pphead;
while (prepos->next != pos)
{
prepos = prepos->next;
}
prepos->next = new;
new->next = pos;
}
}
10.在指定位置之后插入结点
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)
{
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;
printf("尾插 3 1 5\n");
SListPushBack(&plist, 3);
SListPushBack(&plist, 1);
SListPushBack(&plist, 5);
SListPrint(plist);
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);
printf("在3之前插入30\n");
SListInsert(&plist, pos, 30);
SListPrint(plist);
printf("找到5 并删除\n");
pos = SListFind(plist, 5);
SListErase(&plist, pos);
SListPrint(plist);
SListDestroy(&plist);
SListPrint(plist);
}
int main()
{
testlist1();
return 0;
}
今天正好是1024,暂且祝自己节日快乐吧!
青山不改 绿水长流
|