C语言实现无头链表的基本操作

记录下学习过程,方便以后查看。

自己参考些资料,瞎捣鼓的,有不对的地方欢迎指正,谢谢。

直接上代码:

linkList.h 

#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#include
#include
#include


typedef int ElemType;


typedef struct _linkList{
ElemType elem;
struct _linkList *next;
}LinkNode;


typedef LinkNode * LinkList;


//初始化链表
void initList(LinkList *list);
//有序单链表中插入结点,保持列表有序
bool insert(LinkList *list,ElemType elem);
//删除指定的元素
bool del(LinkList *list,ElemType elem);
//创建单链表
bool creatLinkList(LinkList *list, int n);
//归并链表
void mergeList(LinkList *la,LinkList *lb,LinkList *lc);


#endif


linkList.c


#include
#include "linkList.h"


void initList(LinkList *list)
{
*list = NULL;
}


bool insert(LinkList *list,ElemType elem)
{
LinkNode * pnode;
LinkNode * p;
//LinkNode * prev;
//1. 申请内存,存放新结点,需要对申请结果进行判断。
pnode = (LinkNode *)malloc(sizeof(LinkNode));
if(NULL == pnode)
{
return false;
}
//2.初始化新节点的元素及指针
pnode->elem = elem;
pnode->next = NULL;

//3.使用P指针遍历链表,从表头开始查找
p = *list;

//4. 查找链表,找到插入的位置
//1)链表为空
if(NULL == *list)
{
puts("insert the first node!");
*list = pnode;
return true;
//pnode->elem = elem;
//pnode->next = NULL;
}
//2)插入的节点最小,插入到链表首
if(elem < p->elem)
{
*list= pnode;
pnode->next = p;
return true;
}
else //3)插入链表中间或最后
{
//插入链表中间
while(p->next != NULL)
{
if(elem <= p->next->elem)
{
pnode->next = p->next;
p->next = pnode;
return true;//插入完成后需要退出循环
}else{
//prev = p;
p = p->next;
}
}

//插入链表末尾
if(p->next == NULL)
{
pnode->next = NULL;
p->next = pnode;
}
}
return true;
}
bool del(LinkList *list,ElemType elem)
{
LinkNode * current;
LinkNode * prev;
current = *list;
prev = current;
if(NULL == *list)
{
puts("Link list is empty!");
return false;
}

if(current->elem == elem)//删除首节点
{
*list = current->next;
free(current);
}
else
{
/*方式1 删除一个结点
while((current->next!= NULL))
{
if(current->elem !=elem)
{
prev = current;
current = current->next;
}
else{
break;
}
}
if((current->next == NULL)&&(current->elem != elem))
{
puts("not fount,do nothing!");
}
else{


prev->next = current->next;
free(current);
current = NULL;
}
*/

//方式2 删除重复结点
current =current->next;
while(current != NULL)
{
if(current->elem == elem)
{
prev->next = current->next;
free(current);
current = prev->next;
}
else{
prev = current;
current = current->next;
}
}
}

return true;
}
bool creatLinkList(LinkList *plist, int n)
{
LinkNode * head;
LinkNode * pnode;
int index;
int elem;
/*
//创建一个链表头
head = (LinkNode *)malloc(sizeof(LinkNode));
if(NULL == head)
{
return false;
}
head->elem = n;
head->next = NULL;
*list = head;
*/

//判断N值
if(n<=0)
{
puts("value n is illegal!");
return false;
}
for(index =0;index {
puts("please enter the elem :");
scanf("%d",&elem);

if(!insert(plist,elem))
{
return false;
}
}
return true;
}


#if 0
void mergeList(LinkList *la,LinkList *lb,LinkList *lc)
{
LinkNode * indexa;
LinkNode * indexb;
//LinkNode * indexc;
//LinkNode * pc;

indexa = *la;
indexb = *lb;
//indexc = *lc;

while((indexa != NULL)&&(indexb != NULL))
{
//pc = (LinkNode *)malloc(sizeof(LinkNode));
//if(NULL == pc)
//{
// puts("mergeList failed!");
// return;
//}
if(indexa->elem <= indexb->elem)
{
insert(lc,indexa->elem);
indexa = indexa->next;
}
else{
insert(lc,indexb->elem);
indexb = indexb->next;
}
}
while(indexa !=NULL)
{
insert(lc,indexa->elem);
indexa = indexa->next;
}
while(indexb !=NULL)
{
insert(lc,indexb->elem);
indexb =indexb->next;
}
}
#else
void mergeList(LinkList *la,LinkList *lb,LinkList *lc)
{
LinkNode * indexa;
LinkNode * indexb;
LinkNode * indexc;

indexa = *la;
indexb = *lb;
if(((*la) ==NULL)||(*lb)==NULL)
{
if((*la)==NULL)
{
*lc = *lb;
}else
{
*lc = *la;
}
return;
}
else  //如果链表A和链表B都不为空,先确定LC的链表头
{
if(indexa->elem <= indexb->elem)
{
*lc =*la;
indexa = indexa->next;
}
else{
*lc = *lb;
indexb = indexb->next;
}
}
indexc = *lc;

while((indexa != NULL )&&(indexb != NULL))
{
if(indexa->elem <= indexb->elem)
{
indexc->next = indexa;
indexc = indexa;
indexa = indexa->next;
}
else
{
indexc->next = indexb;
indexc = indexb;
indexb = indexb->next;
}
}
indexc->next = indexa?indexa:indexb;

}
#endif


main.c 测试程序

#include
#include "linkList.h"


static printList(LinkList list);
int main(void)
{
LinkList *plist;
LinkList list;
LinkList listb;
LinkList listc;
//LinkNode * bmoov;
LinkNode * pnode;
int num;
//int count =0;
ElemType elem;

plist = &list;

puts("please enter the number of Node:");
scanf("%d",&num);

initList(&list);
initList(&listb);
initList(&listc);
//创建链表
if(!creatLinkList(plist, num))
{
puts("creatLinkLista fail!");
}
//打印链表
puts("Lista is:");
printList(list);

//创建链表
if(!creatLinkList(&listb, num))
{
puts("creatLinkListb fail!");
}

//打印链表b
puts("Listb is:");
printList(listb);

puts("merge list a and b :");
mergeList(&list,&listb,&listc);
printList(listc);

//删除结点
puts("please enter the elem you want to delete:");
while(scanf("%d",&elem)==1)
{
// scanf("%d",&elem);
if(!del(&listc,elem))
{
puts("del node fail!");
}

puts("After delete,List is:");
printList(listc);
puts("please enter the elem you want to delete:");
}
return 0;
}
static printList(LinkList list)
{
LinkNode * pnode;
int count = 0;

if(NULL == list)
{
puts("List is empty!");
}
pnode = list;
while(pnode != NULL)
{
printf("%5d",pnode->elem);
if((++count)%8==0)
{
count = 0;
printf("\n");
}
pnode = pnode->next;
}
puts(" ");
}

















你可能感兴趣的:(数据结构和算法,c语言,单链表)