#include <stdio.h>
#include <stdlib.h>
// 插入:在第i个位置 之前 插入元素e
/*
* p = L 与 p = L->next 的使用
* 此时:LinkList 为空 ===> p = L
* 此时: LinkList 非空 ===> p = L->next
*/
// 链表结构定义
typedef struct Node {
int data;
struct Node *next;
}Node,*LinkList;
// 初始化
LinkList initList() {
LinkList L = (Node *) malloc (sizeof(Node));
L->next = NULL;
return L;
}
// 尾插法创建链表
void tailList (LinkList L) {
Node *r,*s;
int data;
r = L;
printf("输入(-1代表结束): ");
while(1) {
scanf("%d",&data);
if(data == -1) return;
s = (Node *) malloc (sizeof(Node));
s->data = data;
r->next = s;
r = s;
}
}
// 打印链表
void printList (LinkList L) {
Node *p;
p = L->next;
if(!p) return;
while(p) {
printf("%d -> ",p->data);
p = p->next;
}
printf("\n");
}
/*
* 插入
* 1. 找i-1位置
* 2. 找到位置开辟空间,赋值
* 3. 后边内容向后顺延
*/
void insertKey(LinkList L,int i,int key) {
Node *pre,*s;
int j = 0; // 找位置
pre = L->next;
if(!pre && j<i-1) return; // 空链表 && i 的位置不合法
while (pre) {
j++;
if((i-1)!=j) {
pre = pre->next;
} else {
s = (Node *) malloc (sizeof(Node));
s->data = key;
// pre->next = s; // s不丢弃,所以这种写法错误
// pre = s;
s->next = pre->next;
pre->next = s;
// pre->next = pre->next->next; // 错误
// pre->next->next = pre->next; // 错误
return; // 必须写,不写代码会被killed
}
}
}
int main() {
LinkList L;
L = initList(); // 初始化
tailList(L); // 创建
printList(L); // 打印
insertKey(L,3,995); // 插入
printList(L);
return 0;
}