您的位置:首页 > 编程语言 > C语言/C++

【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)

2016-05-30 17:17 495 查看
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//单链表的实现
#include<assert.h>

typedef int DataType;

typedef struct SListNode
{
DataType _data;
struct SListNode* _next;
}SListNode;

SListNode* _CreateNode(DataType x)
{
SListNode* head = (SListNode*)malloc(sizeof(SListNode));
head->_data = x;
head->_next = NULL;
return head;
}

void PushBack(SListNode*& head, DataType x)
{
if (head == NULL)
{
head = _CreateNode(x);
head->_next = NULL;
}
else
{
SListNode* cur = head;
while (cur->_next != NULL)
{
cur = cur->_next;
}
cur->_next = _CreateNode(x);
}

}

void PopBack(SListNode*& head)
{
if (head == NULL)
{
return;
}
else if (head->_next == NULL)
{
free(head);
head = NULL;
}
else
{
SListNode* cur = head;
SListNode* next = head;

while (cur)
{
next = cur->_next;
if (next != NULL && next->_next == NULL)
{
free(next);
cur->_next = NULL;
return;
}

cur = cur->_next;
}
}

}

void PushFront(SListNode*& head,DataType x)
{
if (head == NULL)
{
head = _CreateNode(x);
}
else
{
SListNode* pcur = _CreateNode(x);
pcur->_next = head;
head = pcur;
}
}

void PopFront(SListNode*& head)
{
if (head == NULL)
{
return;
}
else if (head->_next == NULL)
{
free(head);
head = NULL;
}
else
{
SListNode* del = head;
SListNode* next = head->_next;
free(del);
del = NULL;
head = next;
}
}

void Insert(SListNode* head,int pos,DataType x)
{
assert(pos >= 0);
SListNode* cur = head;
while (--pos && cur)
{
cur = cur->_next;
}
if (pos > 0)
{
printf("pos位置大于链表长度!\n");
return;
}
SListNode* newcur = _CreateNode(x);
if (cur->_next)
{
SListNode* next = cur->_next;

cur->_next = newcur;
newcur->_next = next;
}
else if (cur->_next == NULL)
{
cur->_next = newcur;
}
}

size_t Length(SListNode*& head)
{
size_t count = 0;
SListNode* cur = head;
while (cur)
{
count++;
cur = cur->_next;
}
return count;
}

void PrintSList(SListNode*& head)
{
if (head == NULL)
{
return;
}
SListNode* cur = head;
while (cur)
{
printf("%d->", cur->_data);
cur = cur->_next;
}
printf("\n");
}

void Test()
{
SListNode* sList =NULL;
PushBack(sList, 1);
PushBack(sList, 2);
PushBack(sList, 3);
PushBack(sList, 4);
PushBack(sList, 5);
PrintSList(sList);

PopBack(sList);
PrintSList(sList);

PushFront(sList, 0);
PrintSList(sList);

PopFront(sList);
PrintSList(sList);

Insert(sList, 3, 10);
PrintSList(sList);

int ret = Length(sList);
printf("单链表长度为:%d\n", ret);
}

int main()
{
Test();
system("pause");
return 0;
}


本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1747913
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐