//函数中需用到指针,因为要改变链表的数据
#include <stdio.h>
#include <stdlib.h>
#include<time.h>/*用到了time函数,所以要有这个头文件*/
#define FALSE 0;
#define TRUE 1;
typedef int Status;
typedef int ElemType;
typedef struct Node
{
ElemType data;// 数据域
struct Node* next;
}Node;
typedef struct Node* LinkList;//取别名,则Node*等于LinkList
LinkList InitList()//创建头结点
{
LinkList L;
L = (LinkList)malloc(sizeof(Node));
if(L==NULL) //小心别漏这个
{
printf("申请头结点失败!\n");
return NULL;
}
L->next = NULL;
return L;
}
void CreateListTial(LinkList *L,int n)//尾插法建立单链表
{
LinkList p,s;
int i;
srand((unsigned)time(NULL));/*播种子*/
*L = (LinkList)malloc(sizeof(Node));
s = *L;
for (i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;//产生随机数
s->next = p;
s = p;
}
s->next = NULL;//这个不能丢,否则代码出错,不是完整的链表
}
void CreateListHead(LinkList *L,int n)//头插法建立单链表
{
LinkList p;
int i;
srand((unsigned)time(NULL));/*播种子*/
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
for (i=0;i<n;i++)
{
p = (LinkList)malloc(sizeof(Node));
p->data = rand() % 100 + 1;//产生随机数
p->next = (*L)->next; //类似插入一个元素
(*L)->next = p;
}
}
Status GetElem(LinkList L,int i,ElemType *e)//用e返回链表中第i个元素
{
int j = 1;
LinkList p;
p = L->next;//头结点不存放元素,则第一个为头结点后的元素
if (!p || j>i)
{
return FALSE;
}
while (p && j < i)//当链表不为空和j在i之前时,继续循环
{
p = p->next;
++j;
}
*e = p->data;
return TRUE;
}
Status ListInsert(LinkList *L,int i,ElemType e)//将元素e插入到链表L的第i个位置
{
int j = 1;
LinkList p,s;
p = *L;//p直接等于链表L,才有头结点
while (p && j<i)
{
p = p->next;
++j;
}
if(!p || j > i)
return FALSE;
s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;//这里p->next就是指向位置i
p->next = s;
return TRUE;
}
Status ListDelete(LinkList *L,int i,ElemType *e)//删除一个节点
{
int j = 1;
LinkList p,s;
p = *L;
while (p->next && j < i)
{
p = p->next;
++j;
}
if(!(p->next) || j>i)
return 0;
s = (LinkList)malloc(sizeof(Node));
s = p->next;
p->next = s->next;
*e = s->data;
free(s);
return TRUE;
}
Status ClearList(LinkList *L)//整表删除法
{
LinkList p,s;
p = *L;
while (p)
{
s = p->next;
free(p);
p = s;
}
(*L)->next = NULL;
return TRUE;
}
void PrintList(LinkList L)
{
LinkList p;
p = L->next;
while (p != NULL)
{
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
int main()
{
//函数的调用,注意
ElemType e;
LinkList h = NULL;
h = InitList();
CreateListTial(&h,10);
PrintList(h);
ListInsert(&h,1,19);
ListInsert(&h,2,16);
PrintList(h);
GetElem(h,3,&e);//用e返回链表中第i个元素
printf("第三个元素是:%d\n",e);
ListDelete(&h,3,&e);//删除一个节点
printf("删除的第三个元素是:%d\n",e);
PrintList(h);
printf("接下来进行整表删除法\n");
ClearList(&h);//整表删除法
PrintList(h);
printf("用头插法建立单链表\n");
CreateListHead(&h,10);//头插法建立单链表
PrintList(h);
return 0;
}
线性表链式存储结构 单链表
最新推荐文章于 2022-11-21 10:15:27 发布
本文介绍使用C语言实现单链表的各种基本操作,包括创建、插入、删除等,并通过具体示例展示了如何利用这些函数完成对单链表的操作。
1770

被折叠的 条评论
为什么被折叠?



