考研党 数据结构(严蔚敏)List基本操作(纯C语言,与教材一致)

考研党 数据结构(严蔚敏)List基本操作(纯C语言,与教材一致)

本代码示例为纯c语言编写的List基本操作,与数据结构(严蔚敏)课本讲述内容一致,可用于考研同学复习数据结构。

/*linklist.h*/
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 0
#define ERROR -1;

typedef int ElemType;

typedef struct SNode
{
	ElemType data;
	struct SNode *next;	
}Node,*Node_Ptr;

typedef struct SList
{
	Node* head;
	int length;
}LinkList;//便于理解定义链表类型

/*函数声明*/
ElemType Input();
void Init(LinkList *list);
void Insert(LinkList* list, int pos, ElemType e);
void Delete(LinkList* list, ElemType e);
void PrintElem(ElemType e);
void Print(LinkList list);
void Clear(LinkList* list);
void Destory(LinkList* list);
int IsEmpty(LinkList list);
int GetLength(LinkList list);


/*函数定义*/
/*初始化链表*/
void Init(LinkList *list)
{
	Node* pHead = (Node*)malloc(sizeof(Node));
	if(!pHead)
	{
		printf("error:malloc is NULL\n");
		exit(-1);
	}
	pHead->next = NULL;
	list->head = pHead;
	list->length = 0;
}
/*获取链表长度,返回int,也就是长度值*/
int GetLength(LinkList list)
{
	return list.length;
}
/*返回int型,TRUE表示链表为NULL,FALSE表示链表非空*/
int IsEmpty(LinkList list)
{
	if(list.length == 0)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
/*打印单个元素*/
void PrintElem(ElemType e)
{
	printf("%-4d",e);
}
/*打印链表*/
void Print(LinkList list)
{
	if( IsEmpty(list) )
	{
		printf("List is Empty\n");
		return;
	}
	Node* p = list.head;
	p = p->next;
	while(p != NULL)
	{
		PrintElem(p->data);
		p = p->next;
	}
	printf("\n");	
}
/*插入元素,参数1:传入链表地址,参数2:插入位置,参数3:插入元素值*/
void Insert(LinkList* list, int pos, ElemType e )
{
	if(pos < 1)
		pos = 1;
	else if( pos > list->length)
		pos = list->length+1;
	Node* p = list->head;
	while(--pos)
	{
		p = p->next;
	}
	
	Node* pNew = (Node*)malloc(sizeof(Node));
	pNew->data = e;
	pNew->next = NULL;
	
	if(p != NULL)
	{
		pNew->next = p->next;
		p->next = pNew;
	}
	else
	{
		p->next = pNew;
	}
	list->length++;
	return;
}
/*删除元素,参数1:传入链表地址,参数2:要删除的元素值*/
void Delete(LinkList* list, ElemType e)
{
	Node* p = list->head;
	Node* q = p->next;
	while(q != NULL && q->data !=e )
	{	
		p = p->next;
		q = q->next;		
	}
	if(q == NULL)
	{
		printf("No Found this element \n");
		return;
	}
	
	p->next = q->next;	
	free(q);
	q = NULL;
	list->length--;
}


/*输入单个元素,返回值为元素类型用于接收元素*/
ElemType Input()
{
	printf("input Element:");
	ElemType e = 0;
	scanf("%d",&e);
	getchar();
	return e;
}
/*清空链表元素*/
void Clear(LinkList* list)
{
	Node* p = list->head;
	Node* q = p->next;
	while(q != NULL)
	{
		p->next = q->next;
		free(q);
		q=p->next;
		list->length--;
		//Print(*list);	
	}
}
/*销毁链表,链表不在可用,如果要继续使用,需要再次初始化*/
void Destory(LinkList* list)
{
	Clear(list);
	Node* p = list->head;
	free(p);
	p = NULL;
	printf("List is destoried\n");
}
#endif

/*main.c用于测试*/


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

int main(int argc, char *argv[])
{
	int i = 0, pos = 0;
	ElemType e = 0;
	
	LinkList list;
	Init(&list);
	
	for(i=0;i<10;i++)
	{
		pos = rand()%10;
		e = i;
		printf("insert e=%d to pos=%d\t",e,pos);
		Insert(&list, pos, e);
		Print(list);
	}
	printf("list length %d\n",GetLength(list));
	//删除值为5的元素 
	printf("after delete Element's value is 5\n"); 
	Delete(&list, 5);
	Print(list);
	printf("list length %d\n",GetLength(list));
	//再一次删除5的元素,无法找到。 
	printf("again delete Element's value is 5\n");
	Delete(&list, 5);
	printf("list length %d\n",GetLength(list));
	
	Destory(&list);
	return 0;
}


这里写图片描述
代码编译使用软件为Dev-cpp,代码与实际开发一定有不同,但是写代码的目的主要是为了理解数据结构的思想并掌握它。

文件结构

linklist.h(定义List基本操作)
main.c(编写main函数进行测试)

祝愿18考研学生成功。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值