链式存储结构
1,单链表
#include<stdio.h>
#include<stdlib.h>
//表的创建
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*Linklist;
// 此时Lnode *L <==> Linklist L
// 表的初始化
Linklist L_init(){
Linklist L = (Linklist)malloc(sizeof(Lnode));
L->next = NULL;
// 创建头节点,next指向NULL
return L;
}
//表的增加--头插法
//int L_add(Linklist &L ){
// Linklist p = (Linklist)malloc(sizeof(Lnode));
// //p ->next = NULL;
// //int data;
// //scanf("%d",&data);
// scanf("%d",&p->data);//直接这样写,不用在赋值
// //p->data = data;
// p->next = L->next;
// L->next = p;
//
//return 1;
//}
//表的增加--尾插法
int L_add(Linklist &L,int n){
//头结点的意思是数据域与输入的无关,只有指针域是第一个节点的地址
Linklist r = (Linklist)malloc(sizeof(Lnode));
r = L;
for(int i=0;i<n;i++){
Linklist q = (Linklist)malloc(sizeof(Lnode));
scanf("%d",&q->data);
q->next=NULL;
r ->next = q;
r = q;
}
return 1;
}
//表的遍历
void L_print(Linklist L){
Linklist p = (Linklist)malloc(sizeof(Lnode));
p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//表的指定元素删除
void L_delete(Linklist &L , int data){
Linklist p = (Linklist)malloc(sizeof(Lnode));
Linklist q = (Linklist)malloc(sizeof(Lnode));
p = L->next;
while(p->next->data != data){
p = p->next;
}
q = p->next;//临时保存
p->next = p->next->next;
free(q);
}
//表的修改元素的值
void L_resert(Linklist L , int data , int max){
int input,i=1;
Linklist p = (Linklist)malloc(sizeof(Lnode));
p = L->next;
while(p){
if(p->data == data){
printf("请输入改的值\n");
scanf("%d",&input);
p->data = input;
break;
}
i++;
p = p->next;
//printf("%d \n",i);
if(i==max)
printf("NULL\n");
}
}
//Linklist L_resert(Linklist L , int data){
// int input,i=1;
// Linklist p = (Linklist)malloc(sizeof(Lnode));
// p = L->next;
// while(p){
// if(p->data == data){
// printf("请输入改的值\n");
// scanf("%d",&input);
// p->data = input;
// break;
// }
//
// p = p->next;
//
// }
// return p;
//
//}
// 计算表长
void L_long(Linklist L){
Linklist p = (Linklist)malloc(sizeof(Lnode));
p = L->next;
int i = 0;//*************************
while(p){
i++;
p=p->next;
}
printf("%d\n",i);
}
//单链表的删除
int L_delete(Linklist L){
Linklist p = (Linklist)malloc(sizeof(Lnode));
while(L){
p = L;
L=L->next;
free(p);
}
printf("OK\n");
return 1;
}
//单链表的清空
int L_clear(Linklist &L){
Linklist p = (Linklist)malloc(sizeof(Lnode));
Linklist q = (Linklist)malloc(sizeof(Lnode));
while(L->next){
p = L->next;
q = L->next->next;
free(p);
p=q;
q = q->next;
L = L->next;
}
printf("OK\n");
return 1;
}
//单链表取第i个元素
void L_idata(Linklist L , int i , int max){
Linklist p = (Linklist)malloc(sizeof(Lnode));
if(i<=0||i>max){
printf("超出范围\n");}
else{
p = L;
for(int j = 0;j<i;j++){
p = p->next;
}
printf("%d\n",p->data);
}
}
//单链表的元素个数
int L_datanum(Linklist L){
Linklist p = (Linklist)malloc(sizeof(Lnode));
int n = 0;
p = L->next;
while(p){
n++;
p = p->next;
}
printf("%d\n",n);
return n;
}
//插入节点
void L_insertdata(Linklist &L , int data , int locate){
int j =1;
Linklist p = (Linklist)malloc(sizeof(Lnode));
Linklist q = (Linklist)malloc(sizeof(Lnode));
q = L->next;
p->data = data;
//for(int i=1;i<locate-1;i++)
// q = q->next;
while(q&&j<locate-1){q=q->next;j++;}
if(!q||j>locate-1)printf("超出范围\n");
//printf("%d\n",q->data);
p->next = q->next;
q->next = p;
//printf("%d\n",q->next->data);
}
int main(){
int max ;
Linklist L = L_init();
/*L_add(L);
L_add(L);
L_add(L);*/
L_add(L,3);
L_print(L);
//L_delete(L,1);
//L_print(L);
/*max = L_datanum(L);
L_resert(L,2,max);
L_print(L);*/
//L_long(L);
//L_delete(L);
//L_clear(L);
/*max = L_datanum(L);
L_idata(L , 5 , max);*/
//L_print(L);
//L_insertdata(L , 5 , 6);
L_print(L);
return 0;
}
2,单向循环链表
//两个链表合并
#include<stdio.h>
#include<stdlib.h>
//表的创建
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*Linklist;
// 此时Lnode *L <==> Linklist L
// 表的初始化
Linklist L_init(){
Linklist L = (Linklist)malloc(sizeof(Lnode));
L->next = NULL;
// 创建头节点,next指向NULL
return L;
}
int L_add(Linklist &L,int n){
Linklist r = (Linklist)malloc(sizeof(Lnode));
r = L;
for(int i=0;i<n;i++){
Linklist q = (Linklist)malloc(sizeof(Lnode));
scanf("%d",&q->data);
q->next=L;
r ->next = q;
r = q;
//printf("%d\n",q->data);
}
L = r;//尾指针
/*printf("%d\n",L->next->next->data);
printf("%d\n",L->next->next->next->data);
printf("%d\n",L->next->next->next->next->data);*/
return 1;
}
void L_print(Linklist L){
Linklist p = (Linklist)malloc(sizeof(Lnode));
p = L->next->next;//还有一个头节点
while(p!=L->next){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
void L_connect(Linklist &La , Linklist Lb){
Linklist ta = (Linklist)malloc(sizeof(Lnode));
Linklist q = (Linklist)malloc(sizeof(Lnode));
q = Lb->next;
ta = La->next;
La->next = Lb->next->next;
free(q);
Lb->next = ta;
La = Lb;
}
int main(){
Linklist La;
Linklist Lb;
La =L_init();
Lb =L_init();
L_add(La,3);
L_add(Lb,3);
L_print(La);
L_print(Lb);
L_connect(La,Lb);
L_print(La);
return 1;
}
2,双向链表
#include<stdio.h>
#include<stdlib.h>
//表的创建
typedef struct Lnode{
int data;
struct Lnode *prior , *next;
}Lnode , *Du_Linklist;
//表的初始化
Du_Linklist Du_LinklistInit(){
Du_Linklist L = (Du_Linklist)malloc(sizeof(Lnode));
L->prior = NULL;
L->next = NULL;
return L;
}
//表的增加
void L_add(Du_Linklist &L , int n){
Du_Linklist p = (Du_Linklist)malloc(sizeof(Lnode));
p = L;
for (int j =1;j<=n;j++){
Du_Linklist node = (Du_Linklist)malloc(sizeof(Lnode));//需要给他一次次的给与空间,否则就会还是原来的那个地址,不会改变!
scanf("%d",&node->data);
p->next = node;
node->prior = p;
node->next = NULL;
p = node;
}
//printf("%d ",L->next->data);
//printf("%d ",L->next->next->data);
}
// 表的遍历
void L_print(Du_Linklist &L){
Du_Linklist p = (Du_Linklist)malloc(sizeof(Lnode));
p = L->next;
while(p){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
//获取某个元素,并返回其地址
Du_Linklist Getelem(Du_Linklist L , int data){
Du_Linklist p = (Du_Linklist)malloc(sizeof(Lnode));
p = L->next;
while(p->data!=data){
p=p->next;
}
//printf("%d ",p->data);
return p;
}
//插入操作
void L_insert(Du_Linklist &L , int i){
Du_Linklist p = (Du_Linklist)malloc(sizeof(Lnode));
Du_Linklist q = (Du_Linklist)malloc(sizeof(Lnode));
p = Getelem(L,i);
printf("input\n");
scanf("%d",&q->data);
q->prior = p->prior;
p->prior->next = q;
q->next = p;
p->prior = q;
}
// 删除操作
void L_delete(Du_Linklist &L , int i){
Du_Linklist p = (Du_Linklist)malloc(sizeof(Lnode));
Du_Linklist q = (Du_Linklist)malloc(sizeof(Lnode));
p = Getelem(L,i);
printf("%d \n",p->data);
p->prior->next = p->next;
p->next->prior = p->prior;
free(p);
}
int main(){
Du_Linklist L = Du_LinklistInit();
L_add(L,3);
L_print(L);
Getelem(L,2);
L_insert(L,2);
L_print(L);
L_delete(L,2);
L_print(L);
return 1;
}