(郝斌)链表创建、遍历、比较、判断是否为空、求长度对链表排序、插入和删除

 1.链表创建

分配空间

double*=ptd;

ptd=(double*)malloc(30*sizeof(double));//这段代码请求30个double类型值的空间,并把ptd指向该空间所在位置

typedef struct Node

{

  int data;//数据域

  struct Node * pNext;//指针域

} NODE,*PNODE;NODE等价于struct Node;PNODE等价于struct Node*

PNODE creat_list(void)//创建链表不需要返回变量,故不设形参

{
  int len;//创建链表有效节点的个数
  int i;//下标变量
  int val;//用来临时存放用户输入的值

  PNODE pHead=(PNODE)malloc(sizeof(NODE));
  if (NULL==pHead)
  {
  printf("空间分配失败,程序终止!\n");
  exit(-1);//退出
  }

  printf("请输入您需要生成的链表节点的个数:len= ");
  scanf(%d,&len);
  
  for(i=0;i<len;i++)
  {
  
  printf("请输入第%d个节点的值: ",i+1);
  scanf(%d,&val);
  
  PNODE pNew=(PNODE)malloc(sizeof(NODE);
  PNODE pTail=pHead;
  pHead->pNext=NULL;

  if(NULL==pNew)
  {
  printf("空间分配失败,程序终止!\n");
  exit(-1);
  }
  pNew->data=val;//挂,在新节点存放输入值
  pTail->pNext=pNew;//将新节点挂在旧节点后边
  pNew->pNext=NULL;//新节点指针域指向NULL
  pTail=pNew;//因为旧指针存放了数值,将尾指针指向最后一位有效值
  }

return pHead;
  
}

2.链表遍历

链表遍历不需要返回值 void traverse_list(PNODE pHead),变量用到指针,用一个变量可以索引全部链表,头结点

void traverse_list(PNODE pHead)
{

PNODE p=pHead->pNext;//因为要在头节点后,给每个节点赋值;头节点的指针域,指向第一个节点的指针(地址)
while(NULL!=pHead)//判断他不为空的时候,操作;最后一个节点指针域为空,停止
{
printf(%d,p->data);//打印,节点数据域中的数据
p=p->pNext;//下一个节点的指针域。不连续,不能用p++
printf("/n");
}
return;
}

3.链表比较

比较不需要返回值

冒泡法变量需要三个

void sort_list(PNODE pHead)//pHead存储创建链表的头结点地址
{
int i, j, t;

for(i>0;i<len-1;i++)//顺序比较法
  {
for(j>i+1;i<len;j++)
  if(a[i]>a[j])
    {
    t=a[i];
    a[i]=a[j];
    a[j]=t;
    }
  }
}

4.判断链表是否为空

判断头指针指针域,即pHead->pNext是否为空

bool is_empty(PNODE pHead)//bool返回true,false

{
if(pHead->pNext==NULL)
return true;
else
return false;
}

5.求链表长度

调用的函数返回定义的形参

int lenth_list(PNODE pHead)//遍历链表和数组一样,用++就行
{
int len=0;
PNODE p=pHead->pNext;
while(NULL!=p)
{
len++;
p=p->pNext;
}
return len;
}

6.链表插入

需要返回值,用bool

在int pos位置插入数值:

1.链表要能够确定位置,第二个被插入数值要以链表形式被接起来

bool insert_list(PNODE pHead,int pos,int val)
{
int i=0;
PNODE p=pHead;//指向头节点的指针

while(NULL!=p&&i<pos-1)//索引链表,将链表中有效数字序列与pos的大小相比较,当p为空的时候跳出循环,当i=pos时跳出循环,即找到pos
{
p=p->pNext;
++i;
}

if(i>pos-1||NULL==p)//插入位置超出范围或者被插入链表为空,报错
return false;

PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(NULL==pNew)//判断生成链表是否为空
{
printf("动态分配内存失败,程序终止!");
}
pNew->data=val;
PNODE q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;

return true;
}

7.链表删除

索引到链表中pos那个位置,然后后一位依次覆盖前一位

bool delete_list(PNODE pHead,int pos,int* pval)

{

int i=0;

PNODE p=pHead;

while(p!=NULL&&i<pos-1)
{
p=p->pNext;
++i;
}
if(i>pos-1||NULL==P)
{
printf("从动态内存分配失败!");
}
PNODE q=p->pNext;
*pval=q->data;//返回被删除的数值
p->pNext=p->pNext->pNext;
free(q);//释放q申请的空间
q=NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值