单链表是线性表的一种链式存储,属于线性结构,是通过指针来实现链式存储的,比之以顺序表,其存储密度更低,但是在插入,
删除操作上,其效率比顺序表要高;
(一)单链表的结构
typedef struct Node
{
DataType data;
struct Node *next;
}LNode,*LinkList;
(二)单链表上的基本运算实现
(1)建立不带头结点的单链表
(a)从头部插入(与读入数据顺序相反)
#define flag 0
LinkList Creat_LinkList()
{
LinkList L;
LNode *s;
L=NULL;
int x;
scanf("%d",&x);
while(x!=flag)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
scanf("%d",&x);
}
return L;
}
(b)从尾部插入(与读入数据顺序相同)
#define flag 0
LinkList Creat_LinkList()
{
LinkList L;
LNode *s,*r;
L=r=NULL;
int x;
scanf("%d",&x);
while(x!=flag)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
if(L==NULL)
L=s;
else
r->next=s;
r=s;
scanf("%d",&x);
}
if(r)
r->next=NULL;
return L;
}
(2)求表长
(a)带头结点
int Length_LinkList(LinkList L)
{
int i=0;
LNode *p;
p=L;
while(p->next)
{
p=p->next;
i++;
}
return i;
}
(b)不带头结点
int Length_LinkList(LinkList L)
{
int i=0;
LNode *p;
p=L;
while(p)
{
i++;
p=p->next;
}
return i;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef int DataType;
#define flag 0
typedef struct Node
{
DataType data;
struct Node *next;
}LNode,*LinkList;//定义单链表
LNode *Creat_LinkList()//创建带头结点的单链表
{
LinkList L;
int x;
LNode *s,*r;
s=(LNode *)malloc(sizeof(LNode));
s->next=NULL;
L=r=s;
scanf("%d",&x);
while(x!=flag)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
if(L->next==NULL)
L->next=s;
else
r->next=s;
r=s;
scanf("%d",&x);
}
if(r!=NULL)
r->next=NULL;
return L;
}
LinkList reverse(LinkList L)//单链表的倒置算法
{
LNode *p,*q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
return L;
}
int main()
{
LinkList H;
H=Creat_LinkList();
LNode *p;
p=H->next;
while(p)
{
printf(" %d",p->data);
p=p->next;
}
printf("\n");
LinkList S;
S=reverse(H);
LNode *q;
q=S->next;
while(q)
{
printf(" %d",q->data);
q=q->next;
}
printf("\n");
system("pause");
return 0;
}