链表的构造、清空、销毁、删除和插入

include<stdio.h>

include<string.h>

include<malloc.h>

include<stdlib.h>

define ERROR - 2

define OK 1

define OVERFLOW - 1

define LIST_INIT_SIZE 100

define LISTINCREASE 10

//链表的实现
typedef struct LNode
{
int data;
LNode next;
}LNode,
LinkList;

//构造一个链表
int InitList(LinkList L)//用指向指针的形参,可以解决局部变量未初始化的问题,但不知道为什么可以解决
{
(
L) = (LNode)malloc(sizeof(LNode));
if (!L) exit(OVERFLOW);
(
L)->next = NULL;//建立了头结点
return OK;
}

//用头插法插入数据
void HeadInsert(LinkList L)
{
int num;
while (scanf_s("%d", &num) != EOF)
{
LNode temp;
temp = (LNode
)malloc(sizeof(LNode));
if (!temp) exit(OVERFLOW);
temp->data = num;
temp->next = (
L)->next;
(*L)->next = temp;
}
}

//用尾插法插入数据
//void RearInsert(LinkList *L)
//{
// int num;
// LNode rear = (L);
// while (scanf_s("%d", &num) != EOF)
// {
// LNode temp;
// temp = (LNode
)malloc(sizeof(LNode));
// temp->data = num;
// temp->next = NULL;
// rear->next = temp;
// rear = temp;
// }
//}

void RearInsert(LinkList L)//用的一级指针,和用二级指针的运行结果一样(不明白为什么?)
{
int num;
LNode *rear = L;
while (scanf_s("%d", &num) != EOF)
{
LNode temp;
temp = (LNode
)malloc(sizeof(LNode));
if (!temp) exit(OVERFLOW);
temp->data = num;
temp->next = NULL;
rear->next = temp;
rear = temp;
}
}

//输出链表中的所有元素
void PrintList(LinkList L)
{
LNode *temp = L->next;
int j = 0;
while (temp)
{
if (j == 0) printf("%d", temp->data);
else printf(" %d", temp->data);
temp = temp->next;
j++;
}
}

//链表任意位置的插入
int ListInsert(LinkList L, int i, int e)//插入在链表的第i个位置
{
int num = 0;//计数器
LNode *temp = L;
while (temp && (num < i - 1))//插入时要找第i个元素之前的一个元素
{
temp = temp->next;
num++;
}
if (!temp || num > i - 1)// i < 1或者 i大于链表长度加1
return ERROR;
LNode temp1;
temp1 = (LNode
)malloc(sizeof(LNode));
temp1->data = e;
temp1->next = temp->next;
temp->next = temp1;
return OK;
}

//链表元素的删除
int ListDelet(LinkList L, int i)
{
if (L->next == NULL) return ERROR;//要删除元素之前要先检查是否有元素可删
int num = 0;//计数器
LNode *temp = L;
while (!temp && (num < i - 1))
{
temp = temp->next;
temp++;
}
if ((!temp->next) || (num > i - 1)) return ERROR;
LNode *temp1;
temp1 = temp->next;
temp->next = temp->next->next;
free(temp1);
return OK;
}

//链表的清空
void ClearList(LinkList L)//头结点保存,其他结点释放
{
LNode *temp = L->next;
while (temp)
{
LNode *temp1 = temp->next;
free(temp);
temp = temp1;
}
}

//链表的销毁
void DestroyList(LinkList L)
{
LNode *temp = L;
while (L)
{
L = L->next;
free(temp);
temp = L;
}
}

int main()
{
LinkList p;
InitList(&p);
//HeadInsert(&p);
RearInsert(p);
ListInsert(p, 2, 10);
ListDelet(p, 1);
PrintList(p);
ClearList(p);
printf("销毁完毕\n");
}

上一篇:逆置线性表


下一篇:线性表——链表删除