/************************************************************************/
/* 数据结构:线性链表 */
/* 挑灯看剑-shuchangs@126.com 2010-10 */
/* 云歌国际(Cloud Singers International) www.cocoral.com */
/************************************************************************/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include "core.h"
typedef struct LNODE
{
int data; //数据域
struct LNODE* next; //指针域
}LNode, * LNodePointer;
//描述线性链表的头结点
typedef struct
{
int len; //记录线性链表的长度
struct LNODE* head; //记录线性链表的起始地址
}LNodeHead;
void main()
{
/***************函数原型【开始】*************************/
void ListInsert(LNodeHead* H, int i, int e);
void ListPrint(LNodeHead H);
void autoLinearList(LNodeHead* H, int n);
Status ListDelete(LNodeHead* H, int i, LNode* L);
/***************函数原型【结束】*************************/
//初始化线性链表头元
LNodeHead H =
{
0, NULL
};
LNode L =
{
0, NULL
};
int i = 0, j = 0, e = 0;
char tag = 'Y';
ListPrint(H);
autoLinearList(&H, 10);
/*
//动态创建线性链表
puts("请输入插入元素位置和元素值!");
scanf("%d %d %c", &i, &e, &tag);
while (tag == 'Y')
{
ListInsert(&H, i, e);
ListPrint(H);
puts("请输入插入元素位置和元素值!");
scanf("%d %d %c", &i, &e, &tag);
}
*/
//执行删除操作
ListPrint(H);
for (j = 0; j < 5; j++)
{
puts("请输入要删除结点的位置:");
scanf("%d", &i);
if (ListDelete(&H, i, &L))
{
puts("删除成功!");
if (L.next != NULL)
{
printf("当前删除结点值:%d,其后继结点值:%d\n", L.data,
L.next->data);
}
else
{
printf("删除结点值:%d\n", L.data);
}
ListPrint(H);
}
}
}
//在线性单链表L中第i个位置后面插入元素e
void ListInsert(LNodeHead* H, int i, int e)
{
static Status ListIsEmpty(LNodeHead H); //函数原型
LNodePointer p = NULL;//p指向第一个结点
COUNT j = 0; //计数器
LNodePointer s = (LNodePointer) malloc(sizeof(LNode));//为新结点分配存储空间
s->data = e;
//插入前预检查
//如果链表非空
if (!ListIsEmpty(*H))
{
//判断插入条件,保证i在1-Len之间
if (i >= 1 && i <= H->len)
{
//查找第i个元素
p = H->head; //p指向第一个结点
for (j = 1;
j <= i - 1;
j++) //p初始化指向第1个元素,因此循环次数为i-1次
p = p->next; //p前进一位
//执行插入操作
s->next = p->next;
p->next = s;
H->len += 1;//线性链表长度加1
puts("插入成功!");
}
else
{
printf("当前区间:1-%d,插入位置为:%d\n", H->len, i);
puts("插入位置越界,默认为链表中的第一个元素!");
s->next = H->head;
H->head = s;
H->len += 1;//线性链表长度加1
puts("插入成功!");
}
}
else
{
printf("插入前线性链表为空表,插入元素 e=%d 默认为第一个结点!\n",
s->data);
H->head = s;
H->len = 1;
s->next = NULL;
puts("插入成功!");
}
}
static Status ListIsEmpty(LNodeHead H)
{
if (H.len == 0 || H.head == NULL)
return TRUE;
else
return FALSE;
}
void ListPrint(LNodeHead H)
{
LNodePointer p = H.head;
COUNT i = 1;
COUNT n = H.len;
printf("线性链表长度:%d\n", n);
if (!ListIsEmpty(H))
{
for (; i <= n; i++)
{
printf("node[%d] = %d\n", i, p->data);
p = p->next;
}
}
else
{
puts("打印失败,链表为空表!");
}
}
void autoLinearList(LNodeHead* H, int n)
{
//自动生成n个结点的线性链表
LNodePointer p = H->head;
int i = 0;
for (; i <= n; i++)
{
ListInsert(H, i, i * 2);
}
//ListPrint(*H);
}
//删除线性链表中第i个位置结点,并用LNode型结点返回之
Status ListDelete(LNodeHead* H, int i, LNode* L)
{
Status status = ERROR;
LNodePointer p = NULL, q = NULL;
COUNT j = 0, n = H->len;
//判断是否是空表
if (!ListIsEmpty(*H))
{
if (i == 1)
{
//如果i==1
p = H->head; //q指向第一个结点
H->head = p->next;
L->data = p->data;
L->next = p->next;
free(p);
H->len -= 1; //长度减1
status = OK;
puts("删除成功!");
}
else if (i >= 2 && i <= H->len)
{
//如果i在区间2-LEN之间
//先查找i-1个结点
for (p = H->head,j = 2; j <= i - 1; j++)
p = p->next; //p前进一位
//进行删除操作
q = p->next;
p->next = q->next;
L->data = q->data; //重写L的数据域
L->next = q->next;
free(q);
H->len -= 1; //长度减1
status = OK;
puts("删除成功!");
}
else
{
status = ERROR;
printf("删除失败!线性链表区间为:1-%d,删除位置为:%d 越界!\n",
H->len, i);
}
}
else
{
status = ERROR;
puts("删除失败!线性链表为空表!");
}
return status;
}
运行测试结果如下:
线性链表长度:0
打印失败,链表为空表!
插入前线性链表为空表,插入元素 e=0 默认为第一个结点!
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
插入成功!
线性链表长度:11
node[1] = 0
node[2] = 2
node[3] = 4
node[4] = 6
node[5] = 8
node[6] = 10
node[7] = 12
node[8] = 14
node[9] = 16
node[10] = 18
node[11] = 20
请输入要删除结点的位置:
0
删除失败!线性链表区间为:1-11,删除位置为:0 越界!
请输入要删除结点的位置:
12
删除失败!线性链表区间为:1-11,删除位置为:12 越界!
请输入要删除结点的位置:
4
删除成功!
删除成功!
当前删除结点值:6,其后继结点值:8
线性链表长度:10
node[1] = 0
node[2] = 2
node[3] = 4
node[4] = 8
node[5] = 10
node[6] = 12
node[7] = 14
node[8] = 16
node[9] = 18
node[10] = 20
请输入要删除结点的位置:
10
删除成功!