您的位置:首页 > 理论基础 > 数据结构算法

单向链表

2017-05-11 00:15 232 查看
这是一个C语言写的单向链表,数据比较简单

// sngly-linked list.cpp : 定义控制台应用程序的入口点。
//第一个链表存放链表信息
////空表:除了头结点,其他表为空
#include "stdafx.h"
#include<stdlib.h>

#define initSize 10
#define increment 2

typedef int ElemType;
typedef int status;

typedef struct SL
{
ElemType data;
int position;
SL *next;
};
SL *s, *m;//用于创建链表
SL *head,*tail;//头指针,尾指针
int size = 0;

SL* initList(SL *a, SL *b, int length);
void traverse(SL *s);
void insert(SL*a);
void	Pdeletion(SL *a);
void reorder(SL *a);
void Ddeletion(SL *a);
void PFrontChect(SL *a);
void PNextChect(SL *a);
void overview();
void destory(SL *a);
void clearData(SL *a);
void DFrontChect(SL *a);
void DNextChect(SL *a);
void IsEmpty(SL *a);
int main()
{
int length;//链表长度
printf("请输入您需要的链表长度:");
scanf("%d", &length);

traverse(initList(s, m, length));

traverse(head);
insert(tail);
traverse(head);
insert(tail);
traverse(head);
Pdeletion(head);
Pdeletion(head);
reorder(head);
traverse(head);

Ddeletion(head);
Ddeletion(head);
Ddeletion(head);
traverse(head);

PFrontChect(head);
traverse(head);

PNextChect(head);
traverse(head);

overview();
traverse(head);
clearData(head);
traverse(head);

destory(head);
traverse(head);

DFrontChect(head);
DFrontChect(head);
DNextChect(head);
DNextChect(head);

IsEmpty(head);
clearData(head);
IsEmpty(head);
destory(head);
IsEmpty(head);

Ddeletion(head);
traverse(head);
return 0;
}

SL* initList(SL *a,SL *b,int length)
{
size = initSize + sizeof(SL);
a = b = ( SL *) malloc(initSize + sizeof(SL));
head = a;
for (int i = 0; i < length; i++)
{
if (i == 0)
{
a->data = length;
b = (SL *)malloc(initSize + sizeof(SL));
a->next = NULL;
a->position = i;
continue;
}
else
{
a->next = b;
a = b;
}
printf("请为NO.%d赋值:", i);
scanf("%d", &a->data);
printf("已经为NO.%d赋值:%d\n", i, a->data);
b = (SL *)malloc(initSize + sizeof(SL));
a->next = NULL;
a->position = i;

}
tail = a;
printf("链表长度为%d,空间大小为%d\n", length, size);

free(b);

return head;
}

void traverse(SL *a)
{
if (a == NULL)
{
printf("链表不存在\n");
return;
}
printf("本链表共%d个,这是第0个\n", a->data);
a = a->next;
while (a != NULL)
{
printf("第%d个:%d\t",a->position, a->data);
a = a->next;
}printf("\n");
}

//在最后一个插入,传入尾指针
void insert(SL*a)
{
if (a == NULL)
{
printf("链表不存在\n");
return;
}

head->data++;
s = (SL*)malloc(initSize + sizeof(SL));
s->position=a->position++;
a->next = s;
s->next = NULL;

printf("请输入插入的数据:");
scanf("%d", &s->data);
tail = s;//尾指针变动

}

//删除某一个,依据position,传入头指针
void	Pdeletion(SL *a)
{
int times = 0;
if (a == NULL)
{
printf("链表不存在\n");
return;
}

int p;
printf("请输入要删除的链表序号\n");
scanf("%d", &p);
if (p == 0)
{
printf("链表第0个元素不可删除,除非使用destory\n");
return;
}

while (a != NULL)
{

if (a->position == p)
{
//如果是最后一个元素,变动尾指针
if (p == tail->position)
{
tail = s;
}

s->next = a->next;
a->next = NULL;
free(a);
head->data--;

return;
}
else
{
s = a;
a = a->next;

}
}
printf("未查询到该数据\n");
return;

}

//删除某一个,依据data,传入头指针, 可以批量删除
void Ddeletion(SL *a)
{
int times=0;
if (a == NULL)
{
printf("链表不存在\n");
return;
}
ElemType d;
printf("请输入要删除的链表数据\n");
scanf("%d", &d);
s = a;

while (a != NULL)
{

if (a->data == d)
{

//如果是最后一个元素,变动尾指针
if (d == tail->data||a->next==NULL)
{
tail = s;
}
//如果第0个,跳过
if (a->position == 0)
{
printf("链表第0个不可删除,除非使用destory\n");
s = a;
a = a->next;
continue;
}
s->next = a->next;
a->next = NULL;
free(a);
a = s->next;
head->data--;
times++;
}
else
{
s = a;
a = a->next;
}
}
if (times==0)
{
printf("未查询到该数据\n");
return;
}
else
{
printf("已经删除%d个\n", times);
return;
}

}

//重新排序,依照链表位置依次赋值position 1~n,传入头指针
void reorder(SL *a)
{
if (a == NULL)
{
printf("链表不存在\n");
return;
}
a = a->next;
for (int i=1;a != NULL;i++)
{
a->position = i;
a = a->next;
}
}

//前驱查询,传入头指针,依据位置position
void PFrontChect(SL *a)
{
if (a == NULL)
{
printf("链表不存在\n");
return;
}
int p;
printf("请输入要进行前驱查询的的链表序号\n");
scanf("%d", &p);

if (p == 0)
{
printf("这是第一个链表元素,不存在前驱\n");
return;
}
else
{
while (a != NULL)
{

if (a->position == p)
{
printf("第%d个:%d的前驱是:\t", a->position, a->data);
printf("第%d个:%d\n", s->position, s->data);
return;
}
else
{
s = a;
a = a->next;
}
}
printf("不存在该链表\n");
return;
}
}
//后继查询,传入头指针,依据位置position
void PNextChect(SL *a)
{

if (a == NULL)
{
printf("链表不存在\n");
return;
}
int p;
printf("请输入要进行后继查询的的链表序号\n");
scanf("%d", &p);

if (p == tail->data-1)
{
printf("这是最后一个链表元素,不存在后继\n");
return;
}
else
{
while (a != NULL)
{

if (a->position == p)
{
printf("第%d个:%d的后继是:\t", a->position, a->data);
a = a->next;
if (a == NULL)
{
printf("这是最后一个链表元素,不存在后继\n");
}
else
{
printf("第%d个:%d\n", a->position, a->data);
}

return;
}
else
{

a = a->next;
}
}
printf("不存在该链表\n");
return;
}
}

void DFrontChect(SL *a)
{
{
if (a == NULL)
{
printf("链表不存在\n");
return;
}
int d;
printf("请输入要进行前驱查询的的链表数据\n");
scanf("%d", &d);

if (d == a->data)
{
printf("这是第一个链表,不存在前驱\n");
return;
}
else
{
while (a != NULL)
{

if (a->data == d)
{
printf("第%d个:%d的前驱是:\t", a->position, a->data);
printf("第%d个:%d\n", s->position, s->data);
return;
}
else
{
s = a;
a = a->next;
}
}
printf("不存在该链表\n");
return;
}
}
}

void DNextChect(SL *a)
{
if (a == NULL)
{
printf("链表不存在\n");
return;
}
int d;
printf("请输入要进行后继查询的的链表数据\n");
scanf("%d", &d);
if (d == tail->data)
{
printf("这是最后一个链表,不存在后继\n");
return;
}
else
{
while (a != NULL)
{

if (a->data == d)
{
printf("第%d个:%d的后继是:\t", a->position, a->data);
a = a->next;
printf("第%d个:%d\n", a->position, a->data);
return;
}
else
{

a = a->next;
}
}
printf("不存在该链表\n");
return;
}
}
//查看表信息
void overview()
{
if (head == NULL)
{
printf("链表不存在\n");
return;
}
printf("本链表共%d个元素,空间大小为%d\n", head->data,sizeof(SL)+initSize);
return;
}

//销毁,传入头指针
void destory(SL *a)
{
if (a == NULL)
{
printf("链表不存在\n");
return;
}
s = a;
while (a != NULL)
{
a = a->next;
free(s);
s = a;

}
head = NULL;
return ;
}

//清空,,传入头指针
void clearData(SL *a)
{

if (a == NULL)
{
printf("链表不存在\n");
return;
}
a = a->next;

for (int i = 1; a != NULL; i++)
{
a->data = '\0';
a = a->next;
}
}

void IsEmpty(SL *a)
{
if (a == NULL)
{
printf("表不存在\n");
return;
}
if (a->data == 1)
{
printf("空表\n");//除了头结点,其他表为空
return;
}
else
{
printf("表非空\n");
return;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息