线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。(这些存储单元可以是连续的,也可以是不连续的)
下面直接看实现代码,代码只实现了创建,插入和删除:
//
// main.c
// 001-线性表的链式表示和实现
//
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
//线性表的单链表存储结构
typedef struct LNode{
ElemType data;
struct LNode * next;
}LNode, *LinkList;
int createList(LinkList * L, ElemType * elems, int length){
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
for (int i = 0; i < length; i++) {
LinkList p = (LinkList)malloc(sizeof(LNode));
p->next = (*L)->next;
(*L)->next = p; //每个元素都插入到表头
p->data = elems[i];
}
return 1;
}
int insertList(LinkList * L, ElemType elem, int i){
//在带头结点的单链线性表L中第i个位置之前插入元素elem
LinkList p = * L;
int j = 0;
while (p && j < i-1) { //不能在头结点之前插入,故i>1
p = p->next;
j++;
}
if (!p || j > i-1) { //此时到了链表末尾
return 0;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = elem;
s->next = p->next;
p->next = s;
return 1;
}
//删除第i个元素
int deleteList(LinkList * L, int i, ElemType * elem){
LinkList p = *L;
int j = 0;
while (p && j < i-1) { //寻找第i个节点,令p只想其前驱
p = p->next;
j++;
}
if (!(p->next) || j > i-1) {
return 0;
}
LinkList q = p->next; //q就是需要删除的结点
p->next = q->next;
*elem = q->data;
free(q);
return 1;
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, World!\n");
ElemType elems[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
LinkList L;
createList(&L, elems, 10);
for (int i = 0; i < 5; i++) {
insertList(&L, 'k'+i, 3);
}
ElemType elem;
deleteList(&L, 10, &elem);
printf("删除的元素是:%c\n", elem);
LinkList find = L;
while (find->next != NULL) {
find = find->next;
printf("%c\n", find->data);
}
return 0;
}
输出:
Hello, World!
删除的元素是:f
j
i
o
n
m
l
k
h
g
e
d
c
b
a
Program ended with exit code: 0