本文包含以下内容:
0.单链表的结点struct设置及头结点的建立
1.前插法创建单链表
2.尾插法创建单链表
3.前插新结点
4.尾插新结点
5.遍历单链表
6.删除第 i 个结点
7.取第 i 个结点数据域的值
8.查找ElemType e 所在的结点,并返回该结点的地址值
9.源代码
0.单链表的结点struct设置及头结点的建立
初始化(建立单链表的第一个结点),最好在main里面进行,若单独用一个函数进行初始化,分配到的内存在函数结束一段时间以后会被自动收回。头结点可以数据域可以为空,也可存放链表的长度等信息。
定义结点struct:
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
或者
typedef struct ElemType
{
int data_1;
char data_2;
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
本文用第一种struct
1.前插法创建单链表
void head_Create_List(LinkList L,int n) //前插法创建单链表
{
int i;
LNode *p;
for(i=0;i<n;i++)//n个结点
{
p=(LNode *)malloc(sizeof(LNode));
p->data=i;
p->next=L->next;
L->next=p;
}
L->data=n;//第0个结点的数据域可以存放链表的长度
}
2.尾插法创建单链表
void tail_Create_List(LinkList L,int n)//尾插法创建单链表
{
int i;
LNode *p,*r;
r=L;
for(i=0;i<n;i++)
{
p=(LNode *)malloc(sizeof(LNode));
p->data=i;
p->next=NULL;
r->next=p;
r=p;
}
L->data=n;
}
尾插法比前插法多一个指针*r,用于指向链表的尾结点。
3.前插新结点
这部当时漏做了,在后续的循环双向链表中补上
4.尾插新结点
这部也漏做了,在后续的循环双向链表中补上
5.遍历单链表
void Traversal_LinkList(LinkList L)//遍历单链表
{
LNode *p;
p=L->next;
while(p != NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
6.删除第 i 个结点
void ListDelete(LinkList L,int i)//删除第 i 个结点,头结点为第 0 结点
{
LNode *p,*D;
p=L;
int j;
while( (p->next) && (j<i-1) )
{
p=p->next;
j++;
}
if( !(p->next) || (j>i-1) )
{
printf("The location of delete is wrong!\n");
return ;
}
D=p->next;
p->next=D->next;
free(D);
}
7.取第 i 个结点数据域的值
void GetElem(LinkList L, int i, ElemType* e)//取第 i 个结点数据域的值
{
LNode *p;
p=L;
int j=1;
while((p->next) && (j<i+1))
{
p=p->next;
j++;
}
if(!(p->next) || (j>i+1))
{
printf("The location of GetElem is wrong!\n");
return ;
}
*e= p->data;
}
8.查找ElemType e 所在的结点,并返回该结点的地址值
//查找ElemType e 所在的结点,并返回该结点的地址值,更新LinkList_num
LNode *LocateElem(LinkList L, ElemType e,int *LinkList_num)
{
int i=0;
LNode *p=L;
while( p && p->data != e)
{
p=p->next;
i++;
}
if(p)
{
*LinkList_num =i;
//printf("元素%d 在第 %d 个结点!\n",e,i);
}
else
{
printf("%d is Not in this LinkList!\n",e);
p=NULL;
}
return p;
}
9.源代码
/************************************************************/
/* author:givemeway */
/* time:2020-0730 */
/* email:624745042@qq.com */
/* */
/* */
/* */
/************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
//void InitList(LinkList L);//初始化链表
//这一步要在main里面做,单独用一个函数做的话,分配到的内存过一段时间就会被自动收回
void head_Create_List(LinkList L,int n);//前插法创建单链表
void tail_Create_List(LinkList L,int n);//尾插法创建单链表
void head_ListInsert(LinkList L,int i, ElemType e);//前插新结点
void tail_ListInsert(LinkList L,int i, ElemType e);//尾插新结点
void ListDelete(LinkList L,int i);//删除第 i 个结点
void Traversal_LinkList(LinkList L);//遍历单链表
void GetElem(LinkList L, int i, ElemType* e);//取第 i 个结点数据域的值
//查找ElemType e 所在的结点,并返回该结点的地址值
LNode *LocateElem(LinkList L, int e,int *LinkList_num);
int main()
{
LinkList L_head,L_tail,L_location;
ElemType LinkList_num=0;
ElemType *EE;
EE =(ElemType *)malloc(sizeof(ElemType));
L_head=(LinkList )malloc(sizeof(LNode));
L_head->next=NULL;
head_Create_List(L_head,MAX);
Traversal_LinkList(L_head);
ListDelete(L_head,2);
Traversal_LinkList(L_head);
GetElem(L_head,6,&LinkList_num);
printf("GetElem(L_head,6,&LinkList_num)-->LinkList_num= %d\n",LinkList_num);
L_location=LocateElem(L_head,5,&LinkList_num);
if(L_location != NULL)
printf("元素%d 在第 %d 个结点!\n",L_location->data,LinkList_num);
//printf("L_location->data=%d\n",L_location->data);
L_tail=(LinkList )malloc(sizeof(LNode));
L_tail->next=NULL;
tail_Create_List(L_tail,MAX);
Traversal_LinkList(L_tail);
ListDelete(L_tail,3);
Traversal_LinkList(L_tail);
GetElem(L_tail,6,EE);
printf("GetElem(L_tail,6,EE)--> *EE=%d\n",*EE);
L_location=LocateElem(L_tail,11,&LinkList_num);
if(L_location != NULL)
printf("元素%d 在第 %d 个结点!\n",L_location->data,LinkList_num);
//printf("L_location->data=%d\n",L_location->data);
return 0;
}
/* void InitList(LinkList* L)
{
L=(LinkList *)malloc(sizeof(LNode));
L->next=NULL;
} */
void head_Create_List(LinkList L,int n) //前插法创建单链表
{
int i;
LNode *p;
for(i=0;i<n;i++)
{
p=(LNode *)malloc(sizeof(LNode));
p->data=i;
p->next=L->next;
L->next=p;
}
L->data=n;
}
void tail_Create_List(LinkList L,int n)//尾插法创建单链表
{
int i;
LNode *p,*r;
r=L;
for(i=0;i<n;i++)
{
p=(LNode *)malloc(sizeof(LNode));
p->data=i;
p->next=NULL;
r->next=p;
r=p;
}
L->data=n;
}
void Traversal_LinkList(LinkList L)//遍历单链表
{
LNode *p;
p=L->next;
while(p != NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void ListDelete(LinkList L,int i)//删除第 i 个结点,头结点为第 0 结点
{
LNode *p,*D;
p=L;
int j;
while( (p->next) && (j<i-1) )
{
p=p->next;
j++;
}
if( !(p->next) || (j>i-1) )
{
printf("The location of delete is wrong!\n");
return ;
}
D=p->next;
p->next=D->next;
free(D);
}
void GetElem(LinkList L, int i, ElemType* e)//取第 i 个结点数据域的值
{
LNode *p;
p=L;
int j=1;
while((p->next) && (j<i+1))
{
p=p->next;
j++;
}
if(!(p->next) || (j>i+1))
{
printf("The location of GetElem is wrong!\n");
return ;
}
*e= p->data;
}
//查找ElemType e 所在的结点,并返回该结点的地址值,更新LinkList_num
LNode *LocateElem(LinkList L, ElemType e,int *LinkList_num)
{
int i=0;
LNode *p=L;
while( p && p->data != e)
{
p=p->next;
i++;
}
if(p)
{
*LinkList_num =i;
//printf("元素%d 在第 %d 个结点!\n",e,i);
}
else
{
printf("%d is Not in this LinkList!\n",e);
p=NULL;
}
return p;
}