链表
专业术语
-
首节点:第一个有效节点
-
尾结点:最后一个有效节点
-
头结点:
-
头结点的数据类型和首节点一样
-
是第一个有效节点之前的那个节点
-
头结点不存放有效数据
-
加头结点的目的主要是为了方便对链表的操作
-
-
头指针:指向头结点的指针变量
-
尾指针:指向尾结点的指针变量!
链表的操作
1.节点的建立
typedef struct Node{
int data ;//数据域
Node * next;//指针域
}Node,*pNode;
2.链表的建立
1.空链表的建立
pNode creatList(){
pNode p = (pNode)malloc(sizeof(Node));
p->next = NULL;
return p;
}
2.完整的一个链表建立
pNode creatList(){
pNode L = (pNode)malloc(sizeof(Node));//建立头结点
pNode r = L;//再创建一个指针指向头结点
L->next = NULL;
int x;// x来存储输入的值
scanf("%d",&x);
while(x){//假设一直输入,直到输入0为止
pNode p = (pNode)malloc(sizeof(Node));//建立新节点
p->data = x;//把值输入进去
p->next = NULL;//建立连接关系
r->next = p;
r = p;//这个r指针用来当做尾结点
}
return L;
}
3.链表的增删改查
1.链表的增加
1.插入到中间
在第 i 个元素之前插入一个数
pNode insertList(pNode L,int x,int i){
pNode p = L->next;//指向首节点
for(int j = 0 ; j < i-1 && p != NULL ; j++){
p = p->next;//如果p不为空而且j满足条件,则继续指向下一结点
}//直到在第i-1个元素的时候停止循环
pNode p1 = (pNode)malloc(sizeof(Node));//创建一个新节点
p1->data = x;
p1->next = p->next;
p->next = p1;
return L;
}
2.追加到链表尾部
pNode inserEndList(pNode L,int x){
pNode p = L;
pNode p1 = (pNode)malloc(sizeof(Node));
p1->data = x;
//建立联系
p1->next = NULL;//当做尾结点,指针域为空NULL
p->next = p1;
p = p1;
}
2.链表的删除
删除第 i 个元素
int deleteList(pNode L,int i){
pNode p = L->next;
pNode s;
for(int j = 0 ; j < i-1 && p != NULL ; j++){
p = p->next;
}//找到第 i-1 个元素
s = p->next;// s指向第i个元素
int x = s->data;//把要删除的元素存到x中
//修改连接关系
p->next = s->next;//p指向第i+1元素的节点
free(s);
return x;
}