數據結構之單鏈表
#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;
}
#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.