知识总览

2.3.1 单链表的定义
知识总览

单链表定义- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- struct LNode{
- int data;
- struct LNode *next;
- };
- int main(){
- struct LNode *p=(struct LNode*)malloc(sizeof(struct LNode));
- return 0;
- }
复制代码 typedef重命名
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
等同于
struct LNode{
int data;
struct LNode *next;
};
typedef struct LNode LNode;
typedef struct LNode *LinkList;
头插法建立单链表
头插法- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- typedef struct LNode{
- int data;
- struct LNode *next;
- }LNode,*LinkList;
- LinkList List_HeadInsert(LinkList &L){
- LNode *s;
- int x;
- L=(LinkList)malloc(sizeof(LNode)); //创建头节点
- L->next=NULL; //初始为空链表
- scanf("%d",&x); //输入节点的值
- while(x!=9999){ //输出9999表示结束
- s=(LNode*)malloc(sizeof(LNode)); //创建新节点
- s->data=x;
- s->next=L->next;
- L->next=s; //将新节点插入表中,L为头指针
- scanf("%d",&x);
- }
- return L;
- }
- int main(){
- LinkList L;
- List_HeadInsert(L);
- }
复制代码 强调这是一个单链表 ————使用LinkList
强调这是一个节点 ————使用LNode*
不带头节点的单链表- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- typedef struct LNode{
- int data;
- struct LNode *next;
- }LNode,*LinkList;
- //初始化一个空的单链表
- bool InitList(LinkList &L){
- L=NULL; //空表,//防止脏数据
- return true;
- }
- //判断单链表是否为空
- bool Empty(LinkList L){
- return (L==NULL);
- }
- int main(){
- LinkList L; //声明一个指向单链表的指针 //此处并没有创建一个节点
- InitList(L);
- Empty(L);
- }
复制代码 带头结点的单链表- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- typedef struct LNode{
- int data;
- struct LNode *next;
- }LNode,*LinkList;
- //初始化一个单链表 (带头结点)
- bool InitList(LinkList &L){
- L=(LNode*)malloc(sizeof(LNode));
- if(L==NULL)
- return false;
- L->next=NULL;
- return true;
- }
- //判断单链表是否为空 (带头结点)
- bool Empty(LinkList L){
- if(L->next==NULL)
- return true;
- else
- return false;
- }
- int main(){
- LinkList L; //声明一个指向单链表的指针
- InitList(L);
- Empty(L);
- }
复制代码 总结 2.3.2.1知识总览 按位序插入(带头结点)- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- typedef struct LNode{
- int data;
- struct LNode *next;
- }LNode,*LinkList;
- //初始化一个单链表 (带头结点)
- bool InitList(LinkList &L){
- L=(LNode*)malloc(sizeof(LNode));
- if(L==NULL)
- return false;
- L->next=NULL;
- return true;
- }
- //判断单链表是否为空 (带头结点)
- bool Empty(LinkList L){
- if(L->next==NULL)
- return true;
- else
- return false;
- }
- //在第i个位置插入元素e(带头结点)
- bool ListInsert(LinkList &L,int i,int e){
- if(i<1)
- return false;
- LNode *p; //指针p指向当前扫描到的结点
- int j=0; //当前p指向的是第几个结点
- p=L; //L指向头结点,头结点是第0个结点(不存数据)
- while(p!=NULL&&j<i-1){ //循环找到第i-1 个结点 //找位置
- p=p->next;
- j++;
- }
- if(p==NULL) //i值不合法
- return false;
- LNode *s=(LNode*)malloc(sizeof(LNode));
- s->data=e;
- s->next=p->next;
- p->next=s; //将结点s连到p之后
- return true; //插入成功
- }
- int main(){
- LinkList L; //声明一个指向单链表的指针
- InitList(L);
- Empty(L);
- ListInsert(L,1,9);
- }
复制代码 不带头节点
LNode * GetElem(LinkList L ,int i){
int j=1;
LNode *p=L->next;
if(i==0)
return L;
if(i |