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

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;
struct LNode *next;
}LNode, *LinkList;

//构造一个链表
int InitList(LinkList L)//用指向指针的形参,可以解决局部变量未初始化的问题,但不知道为什么可以解决(参数有个星号,但是显示不出来)
{
L = (LNode)malloc(sizeof(LNode));//L前面有个星号,第一个LNode后面要加一个星号
if (!(
L)) exit(OVERFLOW);//L前面有个星号,在括号里面
(*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");
}

posted on 2021-10-04 20:52  安叙  阅读(565)  评论(0编辑  收藏  举报

导航