数据结构之单链表

           简单实现单链表操作!

#include <iostream>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct Lnode
{
    int data;
    struct Lnode *next;
}Lnode, *Linklist;
//初始化单链表
int Initlinklist(Linklist &L)
{
   L = (Linklist)malloc(sizeof(Lnode));
   if(!L)
          return 0;
   L->next=NULL;
   return 1;
}
// 求表长
int Listlength(Linklist L)
{
        Lnode *p = L;
        int i=0;
        while(p->next)
        {
          p = p->next;
          i++;
        }
        return i;
}
// 取表元素
int GetElem(Linklist L, int i, int &e)
{
            Lnode *p=L;
            int count=0;
            while(count<i&&p->next)
            {

                    p=p->next;
                    count++;
            }
            if(i == count)
            {
                      e=p->data;
                      return 1;
            }
            return 0;
}
// 查找
Linklist FindElem(Linklist L, int e)
{

          Lnode *p=L->next;
          while(p&&!(p->data == e))
                    p = p->next;
          if(p)
              return p;
          return NULL;
}
//插入
int ListInsert(Linklist &L, int i, int e)
{
          Lnode *p=L;
          Lnode *q;
          int j=0;
          while(j<i-1&&p->next){
                    p=p->next;
                    j++;
          }
          if(j == i-1)
          {
                    q = (Lnode *)malloc(sizeof(Lnode));
                    if(!q)
                              return 0;
                    q->data=e;
                    q->next=p->next;
                    p->next=q;
                    return 1;
          }
          return 0;
}
// 删除
int DeleteList(Linklist &L, int i, int &e)
{

          Lnode *p=L;
          Lnode *q;
          int j=0;
          while(j<i-1&&p->next)
          {
                p=p->next;
                j++;

          }
          if(j == i-1&&p->next){
                    q=p->next;
                    p->next=q->next;
                    e=q->data;
                    free(q);
                    return 1;
          }
          return 0;
}
//  头建表
void CreaList1(Linklist &L, int n)
{

          Lnode *p;
          int i;
          L=(Lnode*)malloc(sizeof(Lnode));
          L->next = NULL;
          for(i = 0; i<n ;i++)
          {
                     p = (Lnode*)malloc(sizeof(Lnode));
                     scanf("%d", &p->data);
                     p->next=L->next;
                     L->next=p;
          }
}
// 尾建表
void CreaList12(Linklist &L, int n)
{
          Lnode *r, *p;
          int i;
          L = (Lnode *)malloc(sizeof(Lnode));
          r=L;
          for(i=0; i<n; i++)
          {
                    p = (Lnode*)malloc(sizeof(Lnode));
                    scanf("%d", &p->data);
                    r->next = p;
                    r = p;

          }
          r->next=NULL;
}
// 输出
void printLinklist(Linklist &L)
{
          Lnode *p=L->next;
          while(p)
          {
             printf("%d ", p->data);
             p=p->next;
          }
          printf("\n");

}
//  test
int main()
{
       Lnode *L1;
       int n, e, i, flag;
       Initlinklist(L1);
       printf("输入表规模:\n");
       scanf("%d", &n);
       CreaList1(L1, n);
       printLinklist(L1);
       // scanf("%d", &n);
     //  CreaList12(L2, n);
      // printLinklist(L2);
      printf("表长:%d\n", Listlength(L1));

      printf("获取第几号数值:\n");
       scanf("%d", &i);
       if(!GetElem(L1, i, e))
          printf("出错!\n");
      else
          printf("第%d号数值为:%d\n", i, e);

          printf("输入查找节点:\n");
          scanf("%d", &e);
           Lnode *TNode = FindElem(L1, e);
          if(!TNode)
                    printf("没找到!\n");
          else
                    printf("节点数据为:%d\n", TNode->data);

          printf("插入元素位置,数值:\n");
          scanf("%d%d", &i, &e);
          flag = ListInsert(L1, i, e);
          if(!flag)
                    printf("出错!\n");
          else
                    printf("插入成功!\n");

        printf("表长:%d\n", Listlength(L1));

          printLinklist(L1);

          printf("输入删除位置:\n");
          scanf("%d", &i);
          flag=DeleteList(L1, i, e);
          if(!flag)
                    printf("出错!\n");
          else
                    printf("删除位置%d数值%d成功!\n", i, e);

                    printf("表长:%d\n", Listlength(L1));

                      printLinklist(L1);


        return 0;
}

 

posted @ 2014-10-17 10:14  tt_tt--->  阅读(100)  评论(0编辑  收藏  举报