1、创建一个单链表
实现思路:首先,定义一个头结点(*L),为其在内存中开辟一段空间并将指针域指针指向NULL;其次,生成一个新结点p,将要插入的数据元素存储到结点的数据域,并将其指针域指针指向头结点(*L)指向的结点(或NULL);最后,将新结点p插入到表头。
/***
随机产生n个元素的值,建立带头结点的单链线性表L(头插法)***/
//单链表节点的定义
typedef struct{
int data;
struct Node* next;
}Node;
//由一个数组创建单链表
Node* CreateList(int *a, int count)
{
if(NULL == a)
return NULL;
//头结点:开辟空间,赋值数据域、指针域
Node* head = (Node*)malloc(sizeof(Node));
head->data= a[0];
head->next = NULL;
//将链表的头结点赋值给指针变量p
Node* p = head;
for (int i = 1; i < count; ++i)
{
p->next = (Node*)malloc(sizeof(Node));
p->next->data= a[i];
p->next->next = NULL;
p = p->next;
}
return head; //返回链表
}
2、单链表插入
实现思路:首先,对链表进行查询操作,找到第i个位置;其次,为新插入的结点s在内存中开辟一段存储空间并将插入的元素存储到新结点s的数据域中;最后,将p指向的结点位置赋值给新结点s的指针域,再将新结点s的存储地址赋值给工作指针。
/*功能:将元素e插入到单链表的第i个位置*/
#define UNSUCCESS -1
#define SUCCESS 1
typedef Status int;
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j=1;
LinkList p,s; //声明一个结点p
p=*L; //让结点p指向链表L的第一个结点
while(p&&j<i) { //从链表第一个结点开始遍历,直到j=i-1,让p指向存储i-1位置所在的结点
p=p->next; //让p指向下一个结点
++j;
}
if(!p || j>i) //当p指向null或者j大于要查询的位置时,查询失败
return UNSUCCESS ;
s=(LinkList)malloc(sizeof(Node)); //生成新结点,即为新结点开辟一段内存
s->data=e; //查找成功,将数据元素e赋值给s结点的数据域
s->next =p->next;//将结点p的后继结点赋值给s的后继(p->next为指向结点p下一个存储地址所在的结点)
p->next=s; //设置结点p的后继结点为结点s
return SUCCESS ;
}
3、单链表删除操作
实现思想:首先,声明一个结点q并对链表进行查询操作,找到第i个位置;其次,将第i个结点赋值给q;第三,将q的后继(以前的p的后继)赋值为工作指针p的后继;最后,将第i个结点(q)数据域数据存储到指针变量e中,free(q)即释放结点q占用的内存空间
/***功能:删除单链表L中的第i个数据元素(结点)
并将该数据元素存储到指针变量e指向的存储空间中***/
#define UNSUCCESS -1
#define SUCCESS 1
typedef Status int;
Status ListInsert(LinkList *L,int i,ElemType *e)
{
int j=1;
LinkList p,q; //声明一个结点p
p=*L;
//从链表第一个结点开始遍历,直到j=i-1,让p指向存储i-1位置所在的结点
while(p->next&&j<i)
{
p=p->next; //让p指向下一个结点
j++;
}
if(!p || j>i)
return UNSUCCESS;
q=p->next; //设置q为p的后继结点,即将第i个结点的地址保存到q
p->next=q->next; //将q的后继结点设置为p的后继结点
*e=q->data; //将q结点中的数据给e
free(q); //设置完成后,让系统回收此结点,释放内存
return SUCCESS;
}
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。