本文主要实现了链表的整表创建和清理;
链表数据的增删改查;
程序中链表整体创建提供了头部插入和尾部插入两种方式;
数据添加也提供了头部插入和尾部插入两种方式;
实际应用中数据一般会采用,先创建链表头指针,然后利用数据添加函数加入数据。
注意:
本文中链表包含头指针,头指针中数据为空;
#include<stdio.h>
#define ERROR -1
#define OK 0
typedef int state;
struct students
{
int Id;
int age;
} Student;
struct Node {
//struct students student;
int num;
struct Node *next;
} Node;
//自定义类型将LinkList定义为 struct note *类型
typedef struct Node * LinkList;
//创建单链表
//带头指针的链表(头插法)
void createLinkListFirst(LinkList *L,int Length) {
LinkList p;
(*L) = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for (int i = 0; i < Length; i++) {
p = (LinkList)malloc(sizeof(Node));
p->num = 3 * i;
p->next = (*L)->next;
(*L)->next = p;
}
}
//创建单链表
//带头指针的链表(尾插法)
void createLinkListLast(LinkList *L, int Length) {
LinkList p;
LinkList r;
(*L) = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
r = (*L);
for (int i = 0; i < Length; i++) {
p = (LinkList)malloc(sizeof(Node));
p->num = 3 * i;
r->next = p;
r = p;
}
r->next = NULL;
}
//链表中插入数据
state insData(LinkList *L, int data,int local) {
LinkList p;
LinkList tmp;
p = (LinkList)malloc(sizeof(Node));
p->num = data;
int j = 0;
tmp = (*L);
while (p != NULL && j < local) {
tmp = tmp->next;
j++;
}
if (!tmp || j > local)
return ERROR;
p->next = tmp->next;
tmp->next = p;
return OK;
}
//查找数据
state checkData(LinkList *L, int data,int *local) {
LinkList p;
//注意头指针中不含数据,所以第一个数据是(*L)->next;
p = (*L)->next;
int i = 0;
while (p->next != NULL) {
if (p->num == data) {
*local = i;
return OK;
}
p = p->next;
i++;
}
if (p->next == NULL) {
*local = -1;
}
return ERROR;
}
//删除数据
state delData(LinkList *L, int local) {
LinkList p;
LinkList tmp;
int i = 0;
p = (*L);
int j = 0;
while (p->next != NULL && j < local) {
p = p->next;
j++;
}
if (!(p->next) || j > local)
return ERROR;
tmp = p->next;
p->next = tmp->next;
i = tmp->num;
free(tmp);
return OK;
}
//链表整表删除
state clearList(LinkList *L) {
LinkList p;
LinkList tmp;
p = *L;
while (p->next != NULL) {
tmp = p->next;
free(p);
p = tmp;
}
(*L)->next = NULL;
return OK;
}
//在链表中增加数据(尾部增加)
state addDataFirst(LinkList *L, int data) {
LinkList p;
LinkList tmp;
p = (LinkList)malloc(sizeof(Node));
p->num = data;
tmp = *L;
while (tmp->next != NULL) {
tmp = tmp->next;
}
if (tmp->next == NULL && tmp != NULL) {
tmp->next = p;
p->next = NULL;
return OK;
}
else
return ERROR;
}
//在链表中增加数据(头部增加)
state addDataLast(LinkList *L, int data) {
LinkList p;
LinkList tmp;
p = (LinkList)malloc(sizeof(Node));
p->num = data;
p->next = (*L)->next;
(*L)->next = p;
return OK;
}
int main() {
LinkList L;
LinkList p;
state error;
createLinkListLast(&L, 20);
p = L->next;
printf("原始数据:\n");
while (p!=NULL ) {
printf("%d,", p->num);
p = p->next;
}
printf("\n第13个位置插入5后的数据:\n");
insData(&L, 5, 13);
p = L->next;
while (p != NULL) {
printf("%d,", p->num);
p = p->next;
}
printf("\n查找数据5:\n");
int local = -1;
error=checkData(&L, 5, &local);
if (error == OK)
printf("5的位置是:%d", local);
else if (local == -1)
printf("\n数据不存在!\n");
else
printf("\n查找失败!\n");
printf("\n查找数据23:\n");
local = -1;
error = checkData(&L, 23, &local);
if (error == OK)
printf("23的位置是:%d", local);
else if (local == -1)
printf("\n数据不存在!\n");
else
printf("\n查找失败!\n");
printf("\n删除后的数据:\n");
delData(&L, 13);
p = L->next;
while (p != NULL) {
printf("%d,", p->num);
p = p->next;
}
error=clearList(&L);
if (error == OK) {
printf("\n链表清理成功!\n");
}
printf("\n尾部插入数据:\n");
addDataFirst(&L, 5);
p = L->next;
while (p != NULL) {
printf("%d,", p->num);
p = p->next;
}
printf("\n头部插入数据:\n");
addDataLast(&L, 13);
p = L->next;
while (p != NULL) {
printf("%d,", p->num);
p = p->next;
}
getchar();
return 0;
}