/*
* 线性表的链式存储结构
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef int datatype;
typedef struct Node{
datatype info;
struct Node *next;
}Node;
Node *head = NULL;
//为了方便在链表的尾部插入元素,用tail指针指向链表最后一个结点
Node *tail = NULL;
//记录链表存储元素的个数
int size;
/*
* 链表的初始化
*/
void init() {
//动态申请一个结点,该结点不存储数据
//作用:当链表长度为0时,head和tail指向该结点
head = tail = malloc(sizeof(Node));
head->next = tail->next = NULL;
size = 0;
}
/*
* 在链表的尾部插入一个元素
*/
void append(datatype elem) {
Node *node = NULL;
node = malloc(sizeof(Node));
node->info = elem;
node->next = NULL;
tail->next = node;
tail = node;
size++;
}
/*
* 在链表的第i个结点处插入一个元素
*/
void insert(int i, datatype elem) {
if(i < 0 || i > size) {
printf("下标i不合法!");
exit(1);
}
Node *p = head;
for(int j = 0; j < i; j++) {
p = p->next;
}
Node *node = malloc(sizeof(Node));
node->info = elem;
Node *q = p->next;
if(q == NULL) {
tail = node;
}
node->next = q;
p->next = node;
size++;
}
/*
* 在链表中查找第i个结点的值
*/
datatype get(int i) {
if(i < 0 || i >= size) {
printf("下标i不合法");
exit(1);
}
Node *p = head;
for(int j = 0; j < i; j++) {
p = p->next;
}
return p->next->info;
}
/*
* 在链表中删除第i个结点
*/
void delete(int i) {
if(i < 0 || i >= size) {
printf("下标i不合法");
exit(1);
}
Node *p = head;
for(int j = 0; j < i; j++) {
p = p->next;
}
Node *cur = p->next;
if(cur == tail) {
tail = p;
}
p->next = cur->next;
size--;
}
/*
* 打印出线性表中的每个元素
*/
void printList() {
Node *p = head;
if(size == 0) {
printf("单链表是空的!\n");
}else {
p = p->next;
while(p != NULL) {
printf("%d ", p->info);
p = p->next;
}
}
printf("\n");
}