考研党 数据结构(严蔚敏)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考研学生成功。