单链表总结
1.单链表的节点定义:
typedef int DataType;// 节点数据类型
typedef struct Node{
DataType data;// 节点的数据域
struct Node *Next;// 节点的指针域
}LinkNode,*LinkList;
注意:
1> LinkNode*和LinkList是不同名字的同一个指针类型
2> LinkList类型的指针变量表示单链表的头指针
3> LinkNode*类型的指针变量p表示指向某一节点的指针
4> 生成节点的方法
LinkNode *p=(LinkNode*)malloc(sizeof(LinkNode));
2.建立单链表
1.1> 头插法建立无节点的单链表
LinkList CreateListF(void){
// 返回单链表的头指针
int i;
LinkList head;// 头指针
LinkNode *s;// 工作指针
head=NULL;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=head;
head=s;
}
return head;
}
1.2> 头插法建立有头节点的单链表
LinkList CreateListF1(void){
// 返回单链表的头指针
int i;
LinkList head=(LinkNode*)malloc(sizeof(LinkNode));
LinkNode *s;
head->Next=NULL;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=head->Next;
head->Next=s;
}
return head;
}
2.1> 尾插法建立无头节点的单链表
LinkList CreateListR(void){
// 返回单链表的头指针
int i;
LinkList head=NULL;// 定义头指针
LinkNode *s,*p;
p=head;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=NULL;
if(head==NULL)
head=s;
else {
p->Next=s;
}
p=s;
}
return head;
}
2.2> 尾插法建立有头节点的单链表
LinkList CreateListR1(void){
// 返回单链表的头指针
int i;
LinkList head=(LinkNode*)malloc(sizeof(LinkNode));// 定义头指针
LinkNode *s,*p;
p=head;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=NULL;
p->Next=s;
p=s;
}
return head;
}
3.单链表的查找
3.1按序号查找
3.1.1带头节点的单链表的查找
typedef int status;
status searchListByNo(LinkList *L,int i){
int j=0;
LinkNode *p=L;
while(p->Next && j<i){
j++;
p=p->Next;
}
if(j==i)
return 1;
return 0;
}
3.1.2无头节点的单链表的查找
typedef int status;
status searchListByNo1(LinkList *L,int i){
int j=0;
LinkNode *p=L;
while(p && j<i){
j++;
p=p->Next;
}
if(p!=NULL)
return 1;
return 0;
}
3.2按值查找
3.2.1带头节点的单链表的查找
typedef int status;
status searchListByNo(LinkList *L,DataType x){
LinkNode *p=L;
while(p->Next && p->data!=x){
p=p->Next;
}
if(p->data==x)
return 1;
return 0;
}
3.2.2无头节点的单链表的查找
typedef int status;
status searchListByNo1(LinkList *L,DataType x){
LinkNode *p=L;
while(p && p->data!=x){
p=p->Next;
}
if(p!=NULL)
return 1;
return 0;
}
4.单链表的插入
4.1无头节点的单链表的插入
typedef int status;
status InsertList(LinkList *L,DataType x){
//成功返回1,失败返回0
LinkNode *p=L,*q,*s;
if(p==NULL){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->Next=NULL;
p=s;
}
else{
q=p;
while(p && p->data>x){
p=p->Next;
q=p;
}
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->Next=p;
q->Next=s;
}
return 1;
}
4.2有头节点的单链表的插入
typedef int status;
status InsertList1(LinkList *L,DataType x){
//成功返回1,失败返回0
LinkNode *p=L,*q,*s;
q=p;
while(p->Next && p->data>x){
p=p->Next;
q=p;
}
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->Next=p;
q->Next=s;
return 1;
}
5.单链表的删除
5.1带头节点的单链表删除
typedef int status;
status DeleteList(LinkList *L,int i){
LinkNode *p,*q;
int j=0;
if(p==NULL){
return 0;
}
while(p->Next &&j<i){
p=p->Next;
j++;
}
if( p->Next;==NULL)
return 0;
q=p->Next;
p->Next=p->Next->Next;
free(q);
return 1;
}
5.2无头节点的单链表的删除
typedef int status;
status DeleteList1(LinkList *L,int i){
LinkNode *p=L,*q;
int j=0;
q=p;
if(i==0){
q=p->Next;
p->data=q->data;
p->Next=q->Next;
free(q);
return 1;
}
while(p&&j<i){
j++;
q=p;
p=p->Next;
}
if(p==NULL)
return 0;
q->Next=p->Next;
free(p);
return 1;
}
注意:当删除第一个节点时,使用"狸猫换太子"的方法将第一个节点跟第二个节点替换,通过删除第二个节点的方法删除第一个节点
1.单链表的节点定义:
typedef int DataType;// 节点数据类型
typedef struct Node{
DataType data;// 节点的数据域
struct Node *Next;// 节点的指针域
}LinkNode,*LinkList;
注意:
1> LinkNode*和LinkList是不同名字的同一个指针类型
2> LinkList类型的指针变量表示单链表的头指针
3> LinkNode*类型的指针变量p表示指向某一节点的指针
4> 生成节点的方法
LinkNode *p=(LinkNode*)malloc(sizeof(LinkNode));
2.建立单链表
1.1> 头插法建立无节点的单链表
LinkList CreateListF(void){
// 返回单链表的头指针
int i;
LinkList head;// 头指针
LinkNode *s;// 工作指针
head=NULL;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=head;
head=s;
}
return head;
}
1.2> 头插法建立有头节点的单链表
LinkList CreateListF1(void){
// 返回单链表的头指针
int i;
LinkList head=(LinkNode*)malloc(sizeof(LinkNode));
LinkNode *s;
head->Next=NULL;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=head->Next;
head->Next=s;
}
return head;
}
2.1> 尾插法建立无头节点的单链表
LinkList CreateListR(void){
// 返回单链表的头指针
int i;
LinkList head=NULL;// 定义头指针
LinkNode *s,*p;
p=head;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=NULL;
if(head==NULL)
head=s;
else {
p->Next=s;
}
p=s;
}
return head;
}
2.2> 尾插法建立有头节点的单链表
LinkList CreateListR1(void){
// 返回单链表的头指针
int i;
LinkList head=(LinkNode*)malloc(sizeof(LinkNode));// 定义头指针
LinkNode *s,*p;
p=head;
for(i=0;i<10;i++){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=i;
s->Next=NULL;
p->Next=s;
p=s;
}
return head;
}
3.单链表的查找
3.1按序号查找
3.1.1带头节点的单链表的查找
typedef int status;
status searchListByNo(LinkList *L,int i){
int j=0;
LinkNode *p=L;
while(p->Next && j<i){
j++;
p=p->Next;
}
if(j==i)
return 1;
return 0;
}
3.1.2无头节点的单链表的查找
typedef int status;
status searchListByNo1(LinkList *L,int i){
int j=0;
LinkNode *p=L;
while(p && j<i){
j++;
p=p->Next;
}
if(p!=NULL)
return 1;
return 0;
}
3.2按值查找
3.2.1带头节点的单链表的查找
typedef int status;
status searchListByNo(LinkList *L,DataType x){
LinkNode *p=L;
while(p->Next && p->data!=x){
p=p->Next;
}
if(p->data==x)
return 1;
return 0;
}
3.2.2无头节点的单链表的查找
typedef int status;
status searchListByNo1(LinkList *L,DataType x){
LinkNode *p=L;
while(p && p->data!=x){
p=p->Next;
}
if(p!=NULL)
return 1;
return 0;
}
4.单链表的插入
4.1无头节点的单链表的插入
typedef int status;
status InsertList(LinkList *L,DataType x){
//成功返回1,失败返回0
LinkNode *p=L,*q,*s;
if(p==NULL){
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->Next=NULL;
p=s;
}
else{
q=p;
while(p && p->data>x){
p=p->Next;
q=p;
}
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->Next=p;
q->Next=s;
}
return 1;
}
4.2有头节点的单链表的插入
typedef int status;
status InsertList1(LinkList *L,DataType x){
//成功返回1,失败返回0
LinkNode *p=L,*q,*s;
q=p;
while(p->Next && p->data>x){
p=p->Next;
q=p;
}
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->Next=p;
q->Next=s;
return 1;
}
5.单链表的删除
5.1带头节点的单链表删除
typedef int status;
status DeleteList(LinkList *L,int i){
LinkNode *p,*q;
int j=0;
if(p==NULL){
return 0;
}
while(p->Next &&j<i){
p=p->Next;
j++;
}
if( p->Next;==NULL)
return 0;
q=p->Next;
p->Next=p->Next->Next;
free(q);
return 1;
}
5.2无头节点的单链表的删除
typedef int status;
status DeleteList1(LinkList *L,int i){
LinkNode *p=L,*q;
int j=0;
q=p;
if(i==0){
q=p->Next;
p->data=q->data;
p->Next=q->Next;
free(q);
return 1;
}
while(p&&j<i){
j++;
q=p;
p=p->Next;
}
if(p==NULL)
return 0;
q->Next=p->Next;
free(p);
return 1;
}
注意:当删除第一个节点时,使用"狸猫换太子"的方法将第一个节点跟第二个节点替换,通过删除第二个节点的方法删除第一个节点