链表的纯C实现

链表的纯C实现

这道题是我们学校的题目,感觉挺有意思的,也写了有蛮久,我把的代码和思路大致分析一下,希望能给你们带来一些用处。
题目要求是要把c++改成c,原来的c++代码已经全部给出,我改完之后的代码如下(原来的部分代码我就直接注释掉了,然后再改,这样的话可能方便对比)。
链表的纯C实现_第1张图片
链表的纯C实现_第2张图片

//#include
//#include
//#include
//using namespace std;
#include
#include
#include
#include
#define OK 1
#define ERROR 0
//#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型

#define MAXSIZE 100 //链表可能达到的最大长度
typedef struct LNode
{
    ElemType data; //结点的数据域
    struct LNode *next; //结点的指针域
} LNode, *LinkList; //LinkList为指向结构体LNode的指针类型

LinkList L;

//Status InitList(LinkList &L)   //算法2.6 单链表的初始化
Status InitList()
{
    //构造一个空的单链表L
    //L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
    L = (LinkList )malloc(sizeof(LinkList));
    L->next = NULL; //头结点的指针域置空
    return OK;
}

//Status DestroyList(LinkList &L)
Status DestroyList()
{
    /* 初始条件:线性表L已存在。操作结果:销毁线性表L */
    //LinkList q;
    LinkList q;
    while(L)
    {
        q = L->next;
        //delete L;
        free(L);
        L = q;
    }
    return OK;
}

int ListLength()
{
    LNode *p = L->next;
    int i=0;
    while(p)
    {
        i++;
        p = p->next;
    }
    return i;
}

//bool ListEmpty(LinkList L)
void ListEmpty()
{
    //return L->next==NULL;
    if(L->next != NULL)
        printf("Not empty\n");
    else
        printf("Empty\n");
}

//Status GetElem(LinkList L, int i, ElemType &e)   //算法2.7 单链表的取值
Status GetElem( int i, ElemType e)
{
    LNode *p;
    p = L->next;
    int j;
    for(j=1; j<i; j++)
    {
        p = p->next;
    }
    if(!p||j>i)
        return ERROR;
    e = p->data;
    return OK;
} //GetElem

int LocateElem( int e)   //略有改动 算法2.8 按值查找
{
    int j=1;
    LNode *p;
    p = L->next;
    while(p&&p->data!=e)
    {
        p = p->next;
        j++;
    }
    if(p == NULL)
        return ERROR;
    return j;

} //LocateElem

//Status ListInsert(LinkList &L, int i, ElemType e)   //算法2.9 单链表的插入
Status ListInsert( int i, ElemType e)
{
    int j=0;
    LNode *p;
    LNode *s;
    p = L;
    while(p&&(j<i-1))
    {
        p = p->next;
        j++;
    }
    if(!p||j>i-1)
        return ERROR;
    //s = new LNode;
    s = (LinkList )malloc(sizeof(LinkList));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
} //ListInsert

//Status ListDelete(LinkList &L, int i)   //算法2.9 单链表的删除
Status ListDelete( int i)
{
    LNode *p,*q;
    int j=0;
    p = L;
    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;
    //delete q;
    free(q);
    return OK;
} //ListDelete

void ListPrint()
{
   LNode *p=L;
  while(p->next)
  {
      p=p->next;
      printf("%d ",p->data);
  }
      printf("\n");
}

int main()
{
    int i;
    ElemType e;
    //string op;
    char op[20];
    InitList();
    //while(cin >> op)
    while(scanf("%s",op)!=EOF)
    {
        //if(op == "Empty")
        if(strcmp(op,"Empty")==0)
            //cout << (ListEmpty(L) ? "Empty" : "Not empty") << endl;
            {
                ListEmpty();
            }
        //else if(op == "Insert")
        else if(strcmp(op,"Insert")==0)
        {
            //cin >> i >> e;
            scanf("%d%d",&i,&e);
            if(ListInsert( i, e) == ERROR)
                //cout << "Insert failed" << endl;
                printf("Insert failed\n");
            else
                ListPrint();
        }
        //else if(op == "Length")
        else if(strcmp(op,"Length")==0)
        {
            //printf("1");
            //cout << "List length is " << ListLength(L) << endl;
            printf("List length is %d\n",ListLength());
        }
        //else if(op == "GetElem")
        else if(strcmp(op,"GetElem")==0)
        {
            //cin >> i;
            scanf("%d",&i);
            if(GetElem( i, e) == ERROR)
                //cout << "Out of index" << endl;
                printf("Out of index\n");
            else
                //cout << "The elem at position " << i << " is " <<  e << endl;
                printf("The elem at position %d is %d\n",i,e);
        }
        //else if(op == "LocateElem")
        else if(strcmp(op,"LocateElem")==0)
        {
           //cin >> e;
            scanf("%d",&e);
            i = LocateElem( e);
            if(i == 0)
                //cout << e << " is not found in list" << endl;
                printf("%d is not found in list\n",e);
            else
                //cout << e  << " is found at the position " << i << endl;
                printf("%d is found at the position %d\n",e,i);
        }
        //else if(op == "Delete")
        else if(strcmp(op,"Delete")==0)
        {
            //cin >> i;
            scanf("%d",&i);
            if(ListDelete( i) == ERROR)
                //cout << "Delete failed" << endl;
                printf("Delete failed\n");
            else
                ListPrint();
        }
    }
    DestroyList();
    return 0;
}

要注意的事项:

  1. 首先头文件得改,然后我增加了一个全局变量“LinkList L;”(这一步操作在我的代码内很重要)。定义了全局变量后,那么原来函数内都不需要再用“LinkList L;”了这是最基本的操作(当然不用全局变量也可以,但是我觉得会比较麻烦)。
  2. 然后在创建新链表的时候要把“L = new LNode;”改成“L = (LinkList )malloc(sizeof(LinkList));”或者“ L = (LNode *)malloc(sizeof(LNode *));”因为new是c++内才有的操作,在c内得用malloc。
  3. delete也是c++内的操作,在c里面得用free。还有bool函数在c++内是可以直接使用的,但是在c里面不能直接使用,如果要用的话似乎还得定义,我觉得麻烦就直接改成void形式了。
  4. 另外顺带提一下,LNode *p和LinkList p效果一样;
  5. “String op;”也得改成 “char op[x];”
  6. 还有在c函数内要比较输入的字符串是否匹配时可以用strcmp函数,如果输入为s1,你要判断的数为s2。
    当s1 当s1=s2时,返回为0
    当s1>s2时,返回为正数
    输入输出怎么改就不讲了,这个比较简单。

要注意的大概就是这么多了,如果我有什么没有写到位的地方,还希望大家见谅,顺道给我指点一下。

你可能感兴趣的:(数据结构)