數據結構之單鏈表

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
using namespace std;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;
//初始化單鏈表
Status LinkedListInit()
{
    LinkList L;
    L = (LinkList)malloc(sizeof(LNode));   //申請結點空間
    if(L == NULL)                       //判斷是否有足夠的內存空間
        printf("申請內存空間失敗/n");
    L->next = NULL;                  //將next設置爲NULL,初始長度爲0的單鏈表
}
//在單鏈表裏面插入元素
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
    //在帶頭結點的單鏈線性表L中第i個位置之前插入元素
    LinkList p,s;
    int j=0;
    while(p&&j<i-1)
    {
        p=p->next;    //尋找第i-1個結點
        ++j;
    }
    if(!p||i>i-1) return ERROR; //i小於或者大於表長加1
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
//在單鏈表裏面刪除元素
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
    LinkList 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;
    e=q->data;
    free(q);
    return OK;
}
//在La中查找某結點並返回其位置
Status ListLocate_L(LinkList &L,int i,ElemType e)
{
    i=1;
    LinkList p,head;
    p=head->next;
    while(p&&p->data!=e)
    {
        i++;
        p=p->next;
    }
    if(p)
        return i;
    return 0;
}
//打印輸出La中的結點元素值。
void ListDisplay(LinkList &L)
{
    LinkList p;
    int i;
    p=L;
    while(p->next!=NULL)
    {
        printf("結點%d: %d ",i,p->data);
        if(i%3==0)
        {
            printf("\n");
        }
        i++;
    }
    printf("\n");
}
//合併單鏈表
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
    LinkList pa,pb,pc;
    pa=La->next;
    pb=Lb->next;
    Lc=pc=La;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
        else
        {
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;
    free(Lb);
}void NiZhi(LinkList L)//把單向鏈表中元素逆置,類似於頭插法建立鏈表!
{
 LinkList p,s;
 p=s=L->next;
 L->next=NULL;
 while(p)
 {
  s=s->next;
  p->next=L->next;
  L->next=p;
  p=s;
 }
 printf("逆置成功!!!\n\n");
}
void Delete2(LinkList L)//刪除表中所有值相同的多餘元素(使得操作後的線性表中所有元素的值均不相同),
{
    LinkList p,q,s;
    p=L;
    q=L->next;
    while(q->next)
    {
        if(q->data==q->next->data)
        {
            p->next=q->next;
            s=q;
            q=q->next;
            free(s);
        }
        else
        {
            p=p->next;
            q=q->next;
        }
    }
    printf("刪除成功!!!!\n");
}
void fenjie(LinkList L)//利用(1)建立的鏈表,實現將其分解成兩個鏈表,其中一個全部爲奇數,另一個全部爲偶數
{
    LinkList s,p,Lb,cur1,cur2;
    Lb=(LinkList )malloc(sizeof(LNode));
    Lb->next=NULL;
    s=L->next;
    L->next=NULL;
    cur1=L;
    cur2=Lb;
    while(s)
    {
        p=s;
        s=s->next;
        p->next=NULL;
        if(p->data&1)
        {
            cur1->next=p;
            cur1=cur1->next;
        }
        else
        {
            cur2->next=p;
            cur2=cur2->next;
        }
    }
    cur1=L->next;
    cur2=Lb->next;
    printf("元素爲奇數的鏈表:\n");
    while(cur1)
    {
        printf("%d ",cur1->data);
        cur1=cur1->next;
    }
    printf("\n元素爲偶數的鏈表:\n");
    while(cur2)
    {
        printf("%d ",cur2->data);
        cur2=cur2->next;
    }
    printf("\n\n");
}
void Insert(LinkList L,LinkList p)//在升序鏈表插入值爲X的結點,使仍然有序
{
    LinkList s;
    s=L;
    while(s->next && s->next->data < p->data)
        s=s->next;
    p->next=s->next;
    s->next=p;
}
int Sort(LinkList L)//按升序排列
{
    LinkList s,r;
    s=L->next;
    L->next=NULL;
    while(s)
    {
        r=s;
        s=s->next;
        r->next=NULL;
        Insert(L,r);
    }
    return OK;
}
int main()
{
    int op,x,flag;
    LinkList L,p;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    L->data=-1;
    scanf("%d",&op);
    while(op)
    {
        switch(op)
        {
        case 1:
           ListDisplay(L);
            break;
        case 2:
            printf("請輸入要查找的元素X:\n");
            scanf("%d",&x);
            //Find(L,x);
            break;
        case 4:
            Delete2(L);
            break;
        case 5:
            fenjie(L);
            break;
        case 6:
            printf("請輸入要插入的元素X:\n");
            scanf("%d",&x);
            p=(LinkList)malloc(sizeof(LNode));
            p->data=x;
            Insert(L,p);
            printf("插入成功!!!\n\n");
            break;
        case 7:
            flag=Sort(L);
            if(flag)
                printf("排序成功!!\n");
            break;
        case 8:
           NiZhi(L);
            break;
        }
        scanf("%d",&op);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章