数据结构线性表(2)

来源:互联网 发布:长时间运行 python 编辑:程序博客网 时间:2024/04/27 19:05

单链表C语言代码实现

实验要求:编写一个头文件LinkList.h,实现单链表的各种基本运算,并在此基础上设计一个主程序(exp2_2.cpp)完成如下功能:

(1) 初始化单链表L

(2) 依次采用尾插法插入a,b,c,d,e元素

(3) 输出单链表L

(4) 输出单链表L的长度

(5) 判断单链表L是否为空

(6) 输出单链表L的第3个元素

(7) 输出元素a的位置

(8) 在第4个元素位置上插入f元素

(9) 输出单链表L

(10) 删除L的第3个元素

(11) 输出单链表L

(12) 释放单链表L

头文件:

/*文件名:LinkList.h*/#include <stdio.h>#include <malloc.h>#include <stdlib.h>//函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2//定义函数返回的类型typedef int Status;typedef char ElemType;          //定义数据元素的类型为字符型//定义单链表的存储结构typedef struct LNode{ElemType date;struct LNode *next;}LNode,*LinkList; Status InitList(LinkList &L)//构造一个空的单链表L {L=(LinkList)malloc(sizeof (LNode));  //生成结点 if(!L){return OVERFLOW;}L->next=NULL;return OK;}Status DestroyList(LinkList &L)//销毁单链表L {LinkList q=L;while(q!=NULL){LinkList p=q;q=q->next;free(p);p=NULL;}return OK;}Status ListEmpty(LinkList L)//判断是否为空 ,为空返回ture,否则返回false{if(!L->next)     //为空 {return TRUE;} else     return FALSE; }Status ListLength(LinkList L)//返回单链表L的长度{int i=0;  LNode * p;  p =L->next;while(p!=NULL){i++;p=p->next;}return i;}void DispList (LinkList &L)//打印单链表中的元素{LinkList p;p=L->next;while(p!=NULL){printf("%c,  ",p->date);     p=p->next;   }printf("\n");}Status GetElem(LinkList L,int i,ElemType &e)//从单链表L中查找第i个元素,由参数e返回其元素的值{int j=1;   struct LNode *p=L->next;    while(p&&j<i){p=p->next;++j;}if(!p||j>i){             //第i个元素不存在              return ERROR;}e=p->date;               //取第i个元素 return OK;}Status LocateElem(LinkList L,ElemType e)//在单链表L中查找元素e的位置,不存在则返回0{int i=0;LinkList p=L->next;while(p){i++;if(p->date==e) { return i; } p=p->next;}return 0;}Status ListInsert(LinkList &L,int i,ElemType e)//单链表L中第i个位置之前插入元素e {int j=0;LinkList p=L,s;while(p&&j<i-1){p=p->next;++j;}if(!p||j>i-1)                        //i<1或者i>表长+1 {return ERROR;}s=(LinkList)malloc(sizeof(LNode));   //生成新结点 s->date=e;s->next=p->next;p->next=s;return OK;}Status ListDelete(LinkList &L,int i,ElemType &e)//单链表L中删除第i个元素,并由e返回其值 {    int j=0;LinkList p=L,q;while(p->next&&j<i-1){p=p->next;++j;}if(!(p->next)||j>i-1)              //删除位置不合理 {return ERROR;}q=p->next;p->next=q->next;e=q->date;free(q);                          //释放结点 return OK;}



源程序:


#include "LinkList.h"int main(){int l;LinkList(L);ElemType e;printf("初始单链表L\n");InitList(L);printf("依次采用尾插法插入a,b,c,d,e元素\n");ListInsert(L,1,'a');    ListInsert(L,2,'b');ListInsert(L,3,'c');ListInsert(L,4,'d');ListInsert(L,5,'e');printf("输出单链表L:");DispList(L);l=ListLength(L);printf("单链表长度l=%d\n",l);printf("单链表L为%s\n",(ListEmpty(L)?"空":"非空"));GetElem(L,3,e);printf("单链表的第3个元素=%c\n",e);printf ("元素a的位置=%d\n",LocateElem(L,'a'));printf("在第4个元素位置上插入f元素\n");ListInsert(L,4,'f');printf("单链顺序表L:");    DispList(L);printf("删除L的第3个元素\n");ListDelete(L,3,e);printf("输出单链表L:");DispList(L);printf("释放单链表L\n");free(L);return 0;} 
用vc6.0运行后的结果:

我作为初学者,有很多错误与不足,望大家能够指出,我会很乐意接受大家的建议,在此谢谢大家!!!


0 1
原创粉丝点击