单向链表
一:创建以及初始化:
typedef struct node {
int elem;
struct node* next;
}DataNode;
typedef struct {
int count;
DataNode* next;
}*LinkHead,LinkNode;
int Init(LinkHead* L) {//传进来的参数要是有指针符号,那么下面在设变量的时候就不用*
LinkHead p = (LinkHead)malloc(sizeof(LinkHead));
DataNode* q = (DataNode*)malloc(sizeof(DataNode));
q->next = NULL;
p ->count = 0;
p->next = q;//表中的元素初始化
(*L) = p;
return 0;
}
二:插入操作:
int Insert(LinkHead* L, int elem, int pos) {
if (pos<1 || pos>(*L)->count + 1) {
return -1;
}
DataNode* q = (DataNode*)malloc(sizeof(DataNode));//新建一个元素
q->elem = elem;
DataNode* p = (*L)->next;//将表中的所有元素提取出来
for (int i = 1; i < pos; i++) {
p = p->next;//直到插入的那个元素的位置,之前所有元素遍历(很重要)为了下面方便操作,所以将元素遍历到那个元素的位置,以后就按照这个模式遍历就好
}
q->next = p->next;//把将要插入元素位置的后面所有元素赋值到q->next中暂时储存起来,而在q中已经储存进去了那个新元素,那就是第一个elem中
p->next = q;//将插入元素后面的东西再插入进去
(*L)->count += 1;
return 0;
}
三:删除操作:
int Delete(LinkHead* L, int pos) {
if (pos<1 || pos>(*L)->count + 1)
return -1;
DataNode* p = (*L)->next, * q;
for (int i = 1; i <= pos; i++) {//因为要删除,所以要空过那个元素,放到后面
p = p->next;
}
q = p->next;
p->next = q->next;
free(q);
(*L)->count -= 1;
return 0;
}