一、链表的数据结构
(1)顺序存储
int link[10];
(2) 链式存储结构
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //LinkList为结构体类型的指针,可以直接定义变量,比如LinkList p
二、链表的常见的基本操作
(1) 链表的创建
头插法(按照节点的逆序,每插入一个节点都在链表的头部)
typedef struct Lnode
{
ElemTyle date;
struct Lnode*next;
}Lnode;
Lnode*CreatListFront()
{
linklist *p,*head;
head=(LNode*)malloc(sizeof(LNode));
head->next=null;
while(1)
{
scanf("%d",&data);
p->data=data;
p->next=head->next;
head->next=p;
}
return head;
}
尾插法(每插入一个元素,插到链表的尾部)
Lnode *CreateListRear()
{
linklist *p;*head;*q;
head=(LNode*)malloc(sizeof(Lnode));
head->next=null;
while(1)
{
scanf("%d",&data);
q=(LNode*)malloc(sizeof(Lnode));
q->data=data;
q->next=p->next;// q->next=null;
p->next=q;//Q的值赋插在P的后面
p=q;//P指向链表链尾的节点
}
return head;
}
(2)链表的插入
void Insert(Linklist&L,int i,ElemType e)
{
int j=0;
linklist p;
p=l;
while(p!=null&&j<i-1)//查找第I-1个节点P
{
p=p->next;
++j;
}
if(!p||j>i-1) return error;
s=(LNode*)malloc(sizeof(Lnode));
s->data=e;
s->next=p->next;
p->next=s;
}
**(3)链表的删除
void Delete(Linklist&L,int i)
{
int j=0;
linklist p;
p=l;
while(p!=null&&j < i -1)//查找第I-1个节点P
{
p=p->next;
++j;
}
if(!p||j > i-1) return error;
q=(LNode*)malloc(sizeof(Lnode));
q=p->next;
p->next=q->next;
free(q);
}
(3)查找
void FindListElement(Linklist&l, ElemType e)
{
linklist *p=l->next;
int i;
whils(p->next!=null)
{
if(p->data==e)
return i;
}
p=p->next;
i++;
}
(4) 插入(在第I个位置之前插入元素e)**
void Insert(Linklist&l, int i,ElemType e)
{
linklist *p;
s=(LNode*)malloc(sizeof(LNode));
p=l;
int j=0;
while(p!=null&&j<i-1)
{
p=p->next;
j++;
}
if(p==null||j>i-1) return error;
s->data=e;
s->next=p->next;
p->next=s;
}
(5)判断单链表是否为空
int LinklistIsEmpty(linklinst&l)
{
Lnode *p;
p=l;
if(p->next==null)
return 0;
else
return 1;
}
(6) 单链表的反向逆置(1,2,3逆置为3,2,1,)
1.三个指针的方法遍历逆转
void Reservelinklist(Node *head)
{
node*p,q,r;
if(head->next==null||head==null);return error;
p=head;
q=head->next;
head->next=null;//旧的头指针是新的尾指真,所以next为空
while(q)
{
r=q->next;//R先保留下一步要处理的指针
q->next=p;//p q交换指针方向
p=q;
q=r;
}
head=p;//最后q必然是指向空的,所以P作为头结点
return head;
}
方法2 从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。
Node* ReverseList(Node* head)
{
Node *p,*q;
p=head->next;
while(p->next!=NULL) //在这个循环过程中p所指的元素一直是不变的
{
q=p->next;
p->next=q->next;
q->next=head->next;
head->next=q;
}
p->next=head; //相当于成环
head=p->next->next; //新head变为原head的next
p->next->next=NULL; //断掉环
return head;
}
(7)**链表的遍历
反向遍历单链表**
void f(LNode *l)
{
if(l->next==null)
{
cont<<l->data;
}
else
{
f(l->next);
cont<<l->data;
}
}