上一篇讲到线性表的顺序存储实现方式
接了下来就是链式存储的实现了:先讲链式存储的优势,在插入和删除的时候非常方便,但是对于空间的申请具有不确定性
正片开始
结构的定义
typedef struct Node{
int data;
struct Node;
}LNode,*LinkList;
详解如下:这个上面的Node就是它的名字,没有啥作用,除了在这里定义外,木有其他的屁儿用
LNode相当于是它的结构体的类型,如同int的用法,后面使用它的时候如同LNode *p;而LinkList就是它的结构体指针,用法如
同 int *,示例:LinkList p;这个是等同于前面的那个p定义的一样
当然还得要申请一块空间,它才是正真的存在
p=(*LinkList)malloc(sizeof(LNode));
接下来就是常见的操作
insertLinkList();
deleteLinkLiist();
queryLinkList();
updataLinkList();
插入
//在第n个位置插入元素P
void insertLinkList(LinkList L,int n,LNode p){
int i=0;
LNode *q;
q=L;
for(i;i<L.length;i++)
q=q->next;
if(i==n-2){
p=q->next->next;
p->next=q;
}
}
删除操作
//删除第n个位置上的元素
void deleteLinkList(LinkList L,int n){
int i=0;
LinkList *p=L;
if(L.length-1<n){
return 0;
}else{
for(i;i<L.length;i++)
p=p->next;
if(i==n-2){
p->next=p->next->next;
}
}
}
查询也一样
p=p->next;
当前的p->data=data1;返回需要的数据
修改也是一样
查询到要替换的元素,前面的Q=P->next->next;p->next=Q;
写一个初始化的函数吧
void initLinkList(LinkList L){
L=(LinkList)malloc(sizeof(LNode));
//初始化头部
//1、带头节点
L-next=null;
//非头节点就是自己就是元素之一,一般建议是使用带头结点的,因为,总是需要一个flag或者其他的东西去辅助;
}
两种插入方法
1、头插法;如 L 1 、L 2 1、 L 3 2 1、L 5 3 2 1;
2、尾插法:如L 1 、 L 1 2 、L 1 2 3 、L 1 2 3 5;
算法1:单链表的转置:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int data;
struct Node *next;
}LNode,*LinkList;
int main(){
// Node *p;
LinkList L = (LinkList)malloc(sizeof(LNode));
LNode *head=L;
int i=0;
for(i;i<5;i++){
LNode *p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
head->next=p;
head=head->next;
}
revese(L);
LNode *h=L->next;
for(i=0;i<5;i++){
printf("%d\n",h->data);
h=h->next;
}
}
void revese(LinkList L){
LNode *p1;
LNode *q;
p1=L->next;
L->next=NULL;
while(p1){
q=p1;
p1=p1->next;
q->next=L->next;
L->next=q;
}
}
提醒一下,变量名字别重复,无论是在哪个方法里面,不要重复,反正问题多多;