数据结构——线性表的链式结构(C语言)

    链式存储:以节点的方式存储,节点包括数据域和指针域,指针域的指针指向下一个节点的存储位置,数据的存储可以不连续。头指针作为链表的索引,使链表操作方便,头指针指向头节点,头节点指向第一个节点,以此类推,直到尾节点。

以下是源程序:

函数声明

#ifndef List_H
#define List_H

typedef struct Node *PNode;//定义节点指针
typedef int Item;//定义数据类型

typedef struct Node//定义节点结构
{
	Item data;//数据域
	PNode next;//指针域
}node;

typedef PNode Position;
typedef PNode List;

/**函数声明**/
/***创建空链表,并返回链表指针***/
List Creat_Empty(List);

/***判断是否为空链表***/
int Is_Empty(List);

/***创建链表,并返回头指针***/
List Make_List();

/*** 链表反转 ***/
List Invert(List);

/***判断是为最后节点***/
int Is_Last(Position);

/***计算链表的长度***/
int Length(List);

/***遍历链表***/
void Traverse_List(List); 

/***在链表的某个位置插入数据项***/
void Insert(Item,List,Position);

/***查找链表中对应的数据项,并返回该数据项***/
int Search(Item,List);

/***查找链表中对应的数据项,并返回该数据项的前驱位置***/
Position Search_Previous(Item,List);

/***查找链表中对应的数据项,并返回该数据项的后继位置***/
Position Search_Next(Item,List); 

/***获得P的后继节点***/
Position Advance(Position P);

/***删除链表中的某个数据项***/
void Delete(Item,List);

/***删除链表除头节点外的所有节点***/
void Delete_List(List); 

/***查找P节点的数据项***/
int Get_Item(Position P);
#endif

函数定义

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include"List.h"

/**函数定义**/
/***创建空链表,并返回链表指针***/
List Creat_Empty(List L)
{
	L=(PNode)malloc(sizeof(node));
	L->next=NULL;
	L->data=0;
	return L;
}

/***判断是否为空链表***/
int Is_Empty(List L)
{
	return L->next==NULL;
	/*
	if(NULL==L->next)
		return 1;
	else
		return 0;
	*/
}

/***创建链表,并返回链表***/
List Make_List()
{
	int val;
	PNode pHead =(PNode)malloc(sizeof(node));  
	PNode pCurrent = pHead;  
	pCurrent->next = NULL;
	if(NULL==pHead)
		{
			printf("Malloc the list is failed.");
			exit(1);
		}
	printf("Input the first data:");
	while(scanf("%d",&val)==1)
		{
			PNode pNew=(PNode)malloc(sizeof(node));
			if(NULL==pNew)
			{
				printf("Malloc the pNew is failed.");
				exit(1);
			}
			pNew->data=val;
			pCurrent->next=pNew;
			pNew->next=NULL;
			pCurrent=pNew;
			printf("Please input the next data:");
		}
	return pHead;
}

/*** 链表的反转 ***/
List Invert(List Head)
{
    PNode middle, trail;
    middle = NULL;

    PNode temp = Head->next;
    while(temp)
    {
        trail = middle;
        middle = temp;
        temp = temp->next;
        middle->next = trail;
    }
    Head->next = middle;
    return Head;
}


/***判断是为最后节点***/
int Is_Last(Position P)
{
	return P->next==NULL;
}
/***计算链表的长度***/
int Length(List L)
{
	int len=0;
	PNode PCurrent=L->next;
	while(NULL!=PCurrent)
	{
		len++;
		PCurrent=PCurrent->next;
	}
	return len;
}

/***遍历链表***/
void Traverse_List(List L)
{
	PNode PCurrent=L->next;
	printf("The data of list are:\n");
	while(NULL!=PCurrent)
	{
		printf("%d   ",PCurrent->data);
		PCurrent=PCurrent->next;
	}
	printf("\n");
}

/***在链表的某个位置插入数据项***/
void Insert(Item val,List L,Position P)
{
	PNode temp;
	temp=(PNode)malloc(sizeof(node));
	if(NULL==temp)
		exit(0);
	temp->data=val;
	temp->next=P->next;
	P->next=temp;
}

/***查找链表中对应的数据项,并返回该数据项***/
int Search(Item val,List L)
{
	Position P;
	P=L->next;
	if(P!=NULL && P->data !=val)
		P=P->next;
	return P->data;
}

/***查找链表中对应的数据项,并返回该数据项的前驱位置***/
Position Search_Previous(Item val,List L)
{
	Position P;
	P=L;
	if(P->next!=NULL && P->next->data!=val)
		P=P->next;
	return P;
}

/***查找链表中对应的数据项,并返回该数据项的后继位置***/
Position Search_Next(Item val,List L)
{
	Position P;
	P=L;
	if(P!=NULL && P->data!=val)
		P=P->next;
	return P;
}
/*
获得位置P后继节点位置 
*/  
Position Advance(Position P)  
{  
    if(P!=NULL)  
    return P->next;  
}

/***删除链表中的某个数据项***/
void Delete(Item val,List L)
{
	Position P, temp;
	P=Search_Previous(val,L);
	if(!Is_Last(P))
	{
		temp=P->next;
		P->next=temp->next;
		free(temp);
	}

}

/***删除链表L除头节点外的所有节点***/
void Delete_List(List L)
{
	Position P, temp;
	P=L->next;
	L->next=NULL;
	while(P!=NULL)
	{
		temp=P->next;
		free(P);
		P=temp;
	}
}

/***返回P节点位置的数据项****/
int Get_Item(Position P)  
{  
    if(P!=NULL)  
    return P->data;  
} 

测试程序
#include<stdio.h>
#include<stdlib.h>
#include"List.h"
#define NUMBER 5
#define N 3




int main(void)
{
List list;
Position P;
int len,val;
list=NULL;
List L=NULL;

L=Creat_Empty(L);//创建空链表
printf("The empty of list is created.\n");
if(Is_Empty(L))//判断链表是否为空
printf("The list is empty.\n");


list=Make_List();//生成存储有数据项的链表
Traverse_List(list);//遍历该链表

list=Invert(list);//反转链表
Traverse_List(list);//遍历该链表

len=Length(list);//链表的长度
if(!Is_Empty(list))
printf("The length of list is:%d\n",len);


P=list;
Insert(NUMBER,list,P);//在链表中插入数据项
P= Advance(P);//获取P后继节点位置
if(P)
printf("Insert the new data of %d is successed\n",Get_Item(P));
else
printf("Insert the data of %d is failed.\n",NUMBER);
Traverse_List(list);//遍历该链表


val=Search(N,list);//在链表中查找相应的数据项
if(val==N)
printf("Search the data of %d is successed.\n",N);
else
printf("Search the data of %d is failed.\n",N);


Delete(NUMBER,list);//删除数据项
Traverse_List(list);//遍历该链表


Delete_List(list);//摧毁链表
if(Is_Empty(list))
printf("The list is destroied.");
return 0;
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值