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

来源:互联网 发布:网络销售股票是否违法 编辑:程序博客网 时间:2024/05/18 10:50

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

阅读全文
0 0
原创粉丝点击