数据结构
1.创建一个结构体
创建一个包含自身结构的结构体,该结构体由一个数据域和一个指针域组成,数据域用来存储链表的数据,指针域则用来指向下一个结点。
typedef struct Node
{
Elemtype data;
struct Node* next;
}Node
typedef struct Node* Linklist;
2.链表初始化
在链表的初始化过程中要为一个结点用malloc函数分配一个空间,并且开始时Next指针指向一个NULL,然后返回链表(注意判断空间时候申请成功)
LinkList Init_List(void)
{
Node *L;
L=(LinkList)malloc(sizeof(Node));//为根节点申请一个空间
if(L==NULL)
{
printf("链表初始化失败");
exit(-1);
}
L->next=NULL;
return L;
3.单链表初始化插入
a.头插法创建单链表
即每次插入都在最开始的位置,后面的结点依次后移
void Creat_Link(Node *Link)
{
int i,n,data;
Node *Pnew;
printf("请输入链表的长度:");
scanf("%d",&n);
while(n<0)
{
printf("输入的数据非法");
printf("请重新输入链表长度");
scanf("%d",&n);
}
for(i=0;i<n;i++)
{
printf("请输入插入的数据:");
scanf("%d",&data);
Pnew=(LinkList)malloc(sizeof(Node));
if(NULL==Pnew)
{
printf("创建链表时内存分配失败");
exit(-1);
}
Pnew->Data=data;
Pnew->next=Link->next;
Link->next=Pnew;
}
}
由于头插法每次都是插入到前面所以会导致单链表中的顺序与实际要插入的顺序相反
b.尾插法初始化单链表
尾插法建立链表,首先要定义两个指针节点,一个用于中间变量,一个用于将头节点和尾节点重合在一起,每次插入都从尾巴开始,所以插入进来的数据的结点始终指向NULL
void Creat_Link(Node *Link)
{
int i,n,data;
Node *pnew;
printf("请输入插入数据的长度:");
scanf("%d",&n);
while(n<=0)
{
printf("输入的数据的长度有问题,请重新输入");
scanf("%d",&n);
}
for(i=0;i<n;i++)
{
printf("请输入数据:");
scanf("%d",&data);
pnew=(LinkList)malloc(sizeof(Node));
if(pnew==null)
{
printf("内存分配失败");
exit(-1);
}
pnew->Data=data;
Link->next=pnew->next;
Link=Pnew;//将Pnew给Link,相当于将Link往后移动
}
Link->next=NULL;
}
4.单链表中间插入
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
LinkList p=L;
int j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(p==0||j>i-1)
return ERROR;
Linklist s;
s=(Linklist)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
}
5.单链表删除第i个元素
Status ListDelete_L(LinkList &L,int i,ElemType $e)
{
LinkList p;
LinkList q;
p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if((p->next)==null||j>i-1)
return ERROR;
q=p->next;
p_next=q;
e=q->data;
free(q);//释放结点
return OK;
}
6.获取第i个元素的值
Status GetElem_L(LinkList L,int i,ElemType &e)
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(p==0||j>i)
return ERROR;
e=p->data;
return OK;
}
7.输出单链表的所有元素
void printLn(LinkList L)
{
LinkList p;
p=L->next;
while(p!=null)
{
printf("%d",p-next);
p=p->next;