#include
#include
typedef struct LNode{
int data;
struct LNode* next;
}LNode, * LinkList;
//定义 * LinkList 的意义?
//单链表 头插法
LinkList createToH(LinkList L) {
LNode* s; int x; //s指向当前要插入的结点
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf_s("%d", &x);
while (x != -1) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
//结构体声明写typedef struct LNode,否则报错
L->next = s;
scanf_s("%d", &x);
}
return L;
}
//单链表 尾插法
LinkList createToR(LinkList L){
L = (LinkList)malloc(sizeof(LNode));
//r始终指向尾结点,初始指向L,即头结点
LNode* r = L;
LNode* s; int x;
scanf_s("%d", &x);
while (x != -1) {
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf_s("%d", &x);
}
//!!!记得:将尾指针的next置为NULL
r->next = NULL;
return L;
}
void printLNode(LNode* node) {
//L应该指向node->next !!
LinkList L = node->next;
//循环条件为 L!=NULL !!
while (L) {
printf("%d\n",L->data);
L = L->next;
}
}
//!按序号查找
LinkList findByID(LinkList L,int id) {
//查找的id从1开始计数
int j=1;
LinkList p = L->next;
if (id < 0) return NULL;
//若id=0,说明是查找的头结点
if (id == 0)return L;
//循环条件:p不为空
//若为NULL说明已遍历完成
while (p&&jnext;
j++;
}
return p;
}
//按值查找
LinkList findByElem(LinkList L, int e) {
LinkList p = L->next;
while (p && p->data != e) {
p = p->next;
}
return p;
}
//插入结点 (前插)1开始计数
LinkList insert(LinkList L, int i, int e) {
//s指向要插入的结点
//p指向要插入的第i个结点的前一个结点,1开始计数
LinkList s, p;
p = findByID(L, i - 1);
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return L;
}
//删除结点 删除第i个结点 1开始计数
LinkList deleteElem(LinkList L, int i) {
//p指向第i-1个结点
LinkList p = findByID( L ,i - 1);
//s指向被删除的结点
LinkList s = p->next;
//或p->next=s->next;
p->next = p->next->next;
free(s);
return L;
}
int main() {
LNode node;
LinkList L;
// 1 2 3 4 -1
//L = createToH(&node);
L = createToR(&node);
printLNode(L);
//按序号查找
//LinkList result1 = findByID(L, 4);
//按值查找
//LinkList result2 = findByElem(L, 1);
//printf("%d\n", result2->data);
printf("inserting..........\n");
L = insert(L, 4, 100);
printLNode(L);
printf("deleting............\n");
L = deleteElem(L, 5);
printLNode(L);
return 0;
}