一、头插法新建链表
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next;
}LNode,*LinkList;
//LNode*是结构体指针,和LinkList完全等价
//输入3、4、5、6、7、9999
void list_head_insert(LNode* &L){
L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点
L->next=NULL;
ElemType x;
scanf("%d",&x);
LNode *s; //用来指向申请的新结点
while(x!=9999) {
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=L->next; //s的next指向原本链表的第一个结点
L->next=s; //头结点的next指向新结点
scanf("%d",&x);
}
}
void print_list(LinkList L){
L=L->next;
while(L!=NULL){
printf("%3d",L->data);
L=L->next;
}
printf("\n");
}
//头插法新建链表
int main(){
LinkList L; //L是链表头指针,是结构体指针类型
list_head_insert(L);
print_list(L);
return 0;
}
二、尾插法新建链表
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next;
}LNode,*LinkList;
//LNode*是结构体指针,和LinkList完全等价
//输入3、4、5、6、7、9999
void list_tail_insert(LNode* &L){
L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点
L->next=NULL;
ElemType x;
scanf("%d",&x);
LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部
while(x!=9999) {
s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间
s->data=x;
r->next=s; //新结点给尾结点的next指针
r=s; //r指向新的尾部
scanf("%d",&x);
}
r->next=NULL; //让尾结点的next为NULL
}
void print_list(LinkList L){
L=L->next;
while(L!=NULL){
printf("%3d",L->data);
L=L->next;
}
printf("\n");
}
//尾插法新建链表
int main(){
LinkList L; //L是链表头指针,是结构体指针类型
list_tail_insert(L);
print_list(L);
return 0;
}
三、链表按位置查找及按值查找
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next;
}LNode,*LinkList;
//LNode*是结构体指针,和LinkList完全等价
//输入3、4、5、6、7、9999
void list_tail_insert(LNode* &L){
L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点
L->next=NULL;
ElemType x;
scanf("%d",&x);
LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部
while(x!=9999) {
s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间
s->data=x;
r->next=s; //新结点给尾结点的next指针
r=s; //r指向新的尾部
scanf("%d",&x);
}
r->next=NULL; //让尾结点的next为NULL
}
void print_list(LinkList L){
L=L->next;
while(L!=NULL){
printf("%3d",L->data);
L=L->next;
}
printf("\n");
}
//按位置查找
LinkList GetElem(LinkList L,int SearchPos){
int i=0;
if(SearchPos<0)
return NULL;
while(L&&i<SearchPos){
L=L->next;
i++;
}
return L;
}
//按值查找
LinkList LocateElem(LinkList L,ElemType SearchVal){
while(L){
if(L->data==SearchVal){ //如果找到对应的值,就返回结点的地址
return L;
}
L=L->next;
}
return NULL;
}
int main(){
LinkList L,search; //L是链表头指针,是结构体指针类型
list_tail_insert(L);
print_list(L);
//按位置查找
search=GetElem(L,2);
if(search!=NULL){
printf("Succeeded in searching by serial number\n");
printf("%d\n",search->data);
}
//按值查找
search=LocateElem(L,6);
if(search!=NULL){
printf("Search by value succeeded\n");
printf("%d\n",search->data);
}
return 0;
}
四、往第i个位置插入元素
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next;
}LNode,*LinkList;
//LNode*是结构体指针,和LinkList完全等价
//输入3、4、5、6、7、9999
void list_tail_insert(LNode* &L){
L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点
L->next=NULL;
ElemType x;
scanf("%d",&x);
LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部
while(x!=9999) {
s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间
s->data=x;
r->next=s; //新结点给尾结点的next指针
r=s; //r指向新的尾部
scanf("%d",&x);
}
r->next=NULL; //让尾结点的next为NULL
}
void print_list(LinkList L){
L=L->next;
while(L!=NULL){
printf("%3d",L->data);
L=L->next;
}
printf("\n");
}
//按位置查找
LinkList GetElem(LinkList L,int SearchPos){
int i=0;
if(SearchPos<0)
return NULL;
while(L&&i<SearchPos){
L=L->next;
i++;
}
return L;
}
bool ListFrontInsert(LinkList L,int InsertPos,ElemType InsertVal){
LinkList p=GetElem(L,InsertPos-1);
if(p==NULL)
return false;
LinkList q;
q=(LinkList)malloc(sizeof(LNode));
q->data=InsertVal;
q->next=p->next;
p->next=q;
return true;
}
int main(){
LinkList L,search; //L是链表头指针,是结构体指针类型
list_tail_insert(L);
ListFrontInsert(L,2,99);
print_list(L);
return 0;
}
五、单链表删除
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data; //数据域
struct LNode *next;
}LNode,*LinkList;
//LNode*是结构体指针,和LinkList完全等价
//输入3、4、5、6、7、9999
void list_tail_insert(LNode* &L){
L=(LinkList)malloc(sizeof(LNode)); //为头指针申请空间 ,头指针指向头结点
L->next=NULL;
ElemType x;
scanf("%d",&x);
LNode *s,*r=L; //s用来指向申请的新结点 ,r始终指向链表尾部
while(x!=9999) {
s=(LinkList)malloc(sizeof(LNode)); //为新结点申请空间
s->data=x;
r->next=s; //新结点给尾结点的next指针
r=s; //r指向新的尾部
scanf("%d",&x);
}
r->next=NULL; //让尾结点的next为NULL
}
void print_list(LinkList L){
L=L->next;
while(L!=NULL){
printf("%3d",L->data);
L=L->next;
}
printf("\n");
}
//按位置查找
LinkList GetElem(LinkList L,int SearchPos){
int i=0;
if(SearchPos<0)
return NULL;
while(L&&i<SearchPos){
L=L->next;
i++;
}
return L;
}
//删除第i个位置的元素
//删除时L是不会变的,所以不需要加引用
bool ListDelete(LinkList L,int i){
LinkList p=GetElem(L,i-1);// 删除结点的前一个结点
if(p==NULL)
return false;
LinkList q=p->next; //拿到要删除的结点指针
p->next=q->next; //断链
free(q);
return true;
}
int main(){
LinkList L; //L是链表头指针,是结构体指针类型
list_tail_insert(L);
//按位置查找
ListDelete(L,4);
print_list(L);
return 0;
}