单链表的一些基本操作

本文主要介绍了单链表的初始化/头插/头删/尾插/尾删/查找/指定位删除/指定数删除/指定位插入/销毁/排序等.

头文件

#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode* next;

}LinkNode,*pLinkNode;
typedef struct LinkList
{
	LinkNode* pHead;
}LinkList,*pLinkList;
void PrintList(pLinkList pList);//打印函数 
void InitLinkList(pLinkList pList);//初始化函数 
void PushBack(pLinkList pList,DataType x);//尾插 
void PopBack(pLinkList pList);//尾删 
void PushFront(pLinkList pList,DataType x);//头插 
void PopFront(pLinkList pList);//头删 
pLinkNode Find(pLinkList pList,DataType x);
void Insert(pLinkList pList,pLinkNode pos,DataType x);//指定为插入 
void Remove(pLinkList pList,DataType x);//指定数删除 
void RemoveAll(pLinkList pList,DataType x);//删除所有 
void BubbleSort(pLinkList pList);//排序 
void Erase(pLinkList pList,pLinkNode pos);//指定位删除
void Destroy(pLinkList pList);//销毁
#endif //__LINKLIST_H__


 

函数部分

#include"LinkList.h"
void PrintList(pLinkList pList)//打印函数
{
pLinkNode cur=NULL;
assert(pList);
cur = pList->pHead;
while(cur!=NULL)
{
 
 printf("%d->",cur->data);
    cur=cur->next;
}
printf("NULL\n");
}
void InitLinkList(pLinkList pList)//初始化函数
{
 assert(pList);
 //pLinkNode  cur;
 //cur=(pLinkNode)malloc(sizeof(LinkNode));
 //if(cur==NULL)
 //{
 // printf("单链表初始化失败\n");
 //}
 //cur->next=NULL;
 pList->pHead=NULL;
}
void PushBack(pLinkList pList,DataType x)//尾插
{
 assert(pList);
 pLinkNode cur=NULL;
 pLinkNode pre=NULL;
 pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));
 if(newNode==NULL)
 {
  printf("out of memeroy");
  exit(EXIT_FAILURE);
 }
 cur=pList->pHead;
 newNode->data=x;
 newNode->next=NULL;
 if(cur==NULL)
 {
  pList->pHead=newNode;
  return;
 }
 while(cur)
 {
  pre=cur;
  cur=cur->next;
 }
 pre->next=newNode;
 
}
void PopBack(pLinkList pList)//尾删
{
 //assert(pList);
 //pLinkNode pre=pList->pHead;
 //pLinkNode cur=NULL;
 //while(pList)
 //{
 // cur=pre;
 // pre=pre->next;
 //}
 //pre->next=NULL;
 //free(pre);
 //
  assert(pList);
 pLinkNode cur=NULL;
 pLinkNode pre=NULL;
 cur = pList->pHead;
 if(pList->pHead==NULL)
 {
  return;
 }
 else if(cur->next==NULL)
 {
    pList->pHead=cur->next;
 free(cur);
 cur=NULL;
 }
 else
 {
  
  while(cur->next)
 {
 pre=cur;
 cur=cur->next;
 }
 free(cur);
 cur=NULL;
 pre->next=NULL;
 }
}
void PushFront(pLinkList pList,DataType x)//头插
{
 assert(pList);
 pLinkNode cur=pList->pHead;
 pLinkNode pre=(pLinkNode)malloc(sizeof(LinkNode));
 pre->data=x;
 pre->next=cur;
 pList->pHead=pre;

}
void PopFront(pLinkList pList)//头删
{
 assert(pList);
 pLinkNode cur=NULL;
 cur=pList->pHead;
 if(cur==NULL)
  printf("链表为空\n");
 pList->pHead=cur->next;
 free(cur);
 cur=NULL;
}
pLinkNode Find(pLinkList pList,DataType x)
{
 assert(pList);
 pLinkNode cur=pList->pHead;
 while(cur)
 {
  if(cur->data==x)
  
   break;
  
  cur=cur->next;
  
 }
 return cur;
}
void Insert(pLinkList pList,pLinkNode pos,DataType x)//指定位插入
{
 assert(pList);
 pLinkNode cur=NULL;
 pLinkNode pre=NULL;
 DataType tmp=x;
 pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));
 newNode->data=tmp;
 cur=pList->pHead;
 if(cur==NULL)
 {
  PushFront(pList,x);
  return;
 }
 if(pos==NULL)
 {
  printf("无此位置\n");
  return;
 }
 newNode->next=pos->next;
 pos->next=newNode;
 tmp=pos->data;
 pos->data=newNode->data;
 newNode->data=tmp;
}
void Remove(pLinkList pList,DataType x)//指定数删除
{
 assert(pList);
 pLinkNode cur;
 cur=pList->pHead;
 while(cur)
 {
 if(cur->data==x)
 {
  pLinkNode p=NULL;
  cur->data=cur->next->data;
  p=cur->next;
  cur->next=cur->next->next;
  free(p);
  p=NULL;
 }
 cur=cur->next;
 }
 return;
}
void RemoveAll(pLinkList pList,DataType x)//删除所有
{
assert(pList);
 pLinkNode cur=NULL;
 pLinkNode pre=NULL;
 cur=pList->pHead;
 while(cur)
 {
 
  if(cur->data==x)
  {
   pre=cur->next;
   if(cur==pList->pHead)
   {
    PopFront(pList);
   cur=pre;
   }
   else if(cur->next==NULL)
   {
   PopBack(pList);
   cur=NULL;
   break;
   }
         else
   {
   pLinkNode p=NULL;
   cur->data=cur->next->data;
   p=cur->next;
   cur->next=cur->next->next;
   free(p);
   p=NULL;
   }
  }
  else
  {
   cur=cur->next;
  }
   }
  }
 
  
 
void BubbleSort(pLinkList pList)//排序
{
 pLinkNode i;
 pLinkNode j;
 assert(pList);
 for(i=pList->pHead;i!=NULL;i=i->next)
 {
  for(j=i->next;j!=NULL;j=j->next)
  {
   if(j->data<i->data)
   {
   DataType tmp=j->data;
   j->data=i->data;
   i->data=tmp;
   }
  }
 }
}
void Erase(pLinkList pList,pLinkNode pos)//指定位删除
{
 assert(pList);
 pLinkNode cur;
 pLinkNode pre;
 cur=pList->pHead;
 if(pos==cur)
 {
  PopFront(pList);
  return;
 }
 while(pos!=cur)
 {
  pre=cur;
  cur=cur->next;
 }
 pre->next=pos->next;
 free(pos);
 pos=NULL;
}
void Destroy(pLinkList pList)//销毁
{
 pLinkNode cur=pList->pHead;
 assert(pList);
 while(cur)
 {
  pLinkNode tmp=cur;
  cur=cur->next;
  free(tmp);
  tmp=NULL;
 }
 pList->pHead=NULL;

}

 

测试部分

#include"LinkList.h"
void test()
{
	LinkList List={0};
	InitLinkList(&List);
	PushBack(&List,1);
	PushBack(&List,2);
	PushBack(&List,3);
	PushBack(&List,4);
	PushBack(&List,5);
	PushBack(&List,6);
	PrintList(&List);
	PushBack(&List,8);
	PrintList(&List);
	PopBack(&List);
	PopBack(&List);
	PrintList(&List);
	PushFront(&List,9);
	PushFront(&List,10);
	PushFront(&List,11);
	PrintList(&List);
	PopFront(&List);
	PrintList(&List);
	Find(&List,9);
	Insert(&List,Find(&List,2),12);
	PrintList(&List);
	Remove(&List,4);
	PrintList(&List);
    PushBack(&List,3);
    PushBack(&List,3);
    PushBack(&List,3);
	PushBack(&List,3);
	PrintList(&List);
	RemoveAll(&List,3);
	PrintList(&List);
	BubbleSort(&List);
	PrintList(&List);
	Erase(&List,Find(&List,2));
	PrintList(&List);
	Destroy(&List);
	PrintList(&List);
}
int main()
{
	test();
system("pause");
return 0;
}

最近有点懒,就不多说了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值