数据结构与算法单链表

1.什么是链表

     链表我的理解要包含以下特征:(1).由n个节点离散分配;(2).每个节点通过指针连接(3)每一个节点由一个前驱节点和一个后驱节点(4).首节点没有前驱节点,尾节点没有后驱节点;

     满足上面的4条,我们就称为链表;链表既然由很多个节点,那节点又由什么组成?节点由两个部分组成,一是数据域,用来存放有效数据;二是指针域,用来指向下一个节点;下面用C语言来构建链表数据结构,首先应该构造出节点,然后再把所有的节点连起来,就构成了链表;

(1)节点的构造

typedef struct Node
{
    ElementType element;
    Position next;
}Node;

(2)链表的创建

     在创建链表之前,我们需要需要了解一下专业术语:

   首节点:存放第一个有效数据的节点;

   尾节点:存放最后一个有效数据的节点;

   头节点:头节点的数据类型与首节点的数据类型相同,并且头节点是首节点前面的那个节点,并不存放有效数据;头节点的存在只是为了方便链表的操作。

   头指针:指向头节点的指针;

   尾指针:指向尾节点的指针;

首先,我们应该创建一个头节点,并用头指针指向它,用C语言描述:用malloc向计算机申请一块内存,并定义一个指向与头节点数据类型相同的指针(一定要判断申请内存是否成功);

然后,要知道要创建链表的长度,用一个循环来每次创建一个节点,并把每个节点连在一起;

(3)检查空表

int IsEmpty(List L)  
{  
    return L->Next==NULL;  
}  
如果是空表,表的第一个指针指向NULL。
(4)查找节点

Position Find(ElementType X, List L)  
{  
    Position P;  
    P = L->Next;  
    while(L!=NULL && L->Element!=X)  
        P = P->Next;  
    return P;  
}  

(5)插入节点

void Insert(ElementType X,List L,Position P)  
{  
    Position tmp;  
    Tmp = malloc(sizeof(struct Node));  
    if(tmp==NULL)  
        FatalError("Out of Space!");  
    Tmp->Element = X;  
    Tmp->Next = P->Next;  
    P->Next = Tmp;  
}  

(6)删除节点

6.1删除节点之前,我们要找到所删除节点的位置,即前驱

Position FindPrevious(ElementType X, List L)  
{  
    Position P;  
    P=L;  
    while(P->Next!=NULL && P_>Next->Element!=X)  
        P=P->Next;  
    return p;  
}  

6.2找到前驱后进行删除

void Delete(ElementType X,List L)  
{  
    Position P,Tmp;  
    P = FindPrevious(X,L);  
    if(!IsLast(P,L))  
    {  
        Tmp = P->Next;  
        p->Next = Tmp->Next;  
        free(Tmp);  
    }  
}  
int IsLast(Position P,List L)  
{  
    return P->Next==NULL;  
}  

本篇博客主要介绍带头结点的单链表的一系列操作,包括链表的创建,链表的插入,链表的删除,链表的查找,判断一个链表是否为空,以及在写程序的时候一些注意事项等内容。链表是数据内容的基础,学好了,后面栈就比较容易了。下面就发布可以运行的完整的程序来例举了上述所有的内容

#include <stdio.h>
#include <stdlib.h>

struct Node;
typedef struct Node* ptrToNode;
typedef ptrToNode List;
typedef ptrToNode Position;
typedef int ElementType;

typedef struct Node
{
    ElementType element;
    Position next;
}Node;


List createList(int *ptr, int len)
{
    List head;
    Position p;
    Position tmp;
    head =(Position)malloc(sizeof(struct Node)); 
    p = (Position)malloc(sizeof(struct Node)); 
    int i = 0;
    for(; i < len; i++)
    {
	if (i == 0)
	{
		p -> element = *(ptr + i);//遍历第一个元素 
		head -> next = p;
	}
	else
	{
   		tmp = (Position)malloc(sizeof(struct Node)); 
	     	tmp -> element=*(ptr+i);
        	p -> next = tmp;
		p = p->next;
	}
    }
    p -> next = NULL;
    return head;
}


int IsEmpty(List L)
{
   return L->next == NULL;
}

Position FindPrevious(ElementType X, List L)
{
	Position p;
	p = L;
	while(p->next != NULL && p->next->element != X)
		p = p ->next;
	return p;

}

void Delete(ElementType X, List L)
{
	Position previous;
	Position pnow;
	previous = FindPrevious(X,L);
	if(IsEmpty(previous))
	{
		printf("Sorry, there is no %d in the list!\n", X);
		exit(1);
	}
	else
	{
		pnow = previous -> next;
		previous -> next = pnow -> next;
		free(pnow);
	}
}
void prinList(List L)
{
	Position p = L -> next;
	printf("The list is: \n");
	while(p->next != NULL)
	{
		printf("%d ",p -> element);
		p = p -> next;
	}
	printf("\n");
}

void InsertList(ElementType X, Position P, List L)
{
	Position temp;
	temp =(Position)malloc(sizeof(struct Node)); 
	if (!temp)
	{
		printf("Out of space!\n");
		exit(1);
	}
	temp -> element = X;
	temp -> next = P -> next;
	P -> next = temp;
}
int main()
{
    int a[10] = {8,54,6,86,23,2,1,93,4,85};
    List L = (Position)malloc(sizeof(struct Node)); 
    L = createList(a,10);
    if(IsEmpty(L))
	{
		printf("The list is empty!\n");
		exit(1);
	}
	prinList(L);
	Delete(a[5],L);
	prinList(L);
	InsertList(a[3],L->next,L);
	prinList(L);
    return 0;
}

程序结果



参考博客:http://blog.youkuaiyun.com/lpp0900320123/article/details/20356143

                 http://blog.youkuaiyun.com/xiaxia__/article/details/16865859


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值