太自由

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1 //infeasible-->不可行的
#define NULL 0

typedef int Status;
typedef int ElemType;

//定义结构体
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;


//逆序输入n个元素的值,创建一个带表头节点的单链表
void CreatList_L(LinkList &L,int n)
{
int i;
LNode *p;

L=(LinkList)malloc(sizeof(LNode));
L->data=0; //令表头中的数据域内的值为0(其值为表中元素的个数)
L->next=NULL; //建立带表头节点的单链表
printf("Please input data:(输入8个整数)\n");
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next=p;
L->data++; //递增表中元素的个数
}
// printf("%d",L->data); //此处L->data的功能是输出表中元素的个数
}


//查找单链表中第i个元素,若存在,其值赋给e并返回OK,否则返回ERROR
Status GetElem_L(LinkList L,int i,ElemType &e)
{
//L为带头结点的单链表的头指针
LNode *p1;
p1=L->next;
int j=1; //初始化,p指向第一个结点,j为计数器
while(p1 && j<i)
{
p1 = p1->next;
++j;
}
if(!p1 || j>i)
return ERROR; //第i个元素不存在
e=p1->data;
return OK;
}

//带表头结点的单链表的插入
Status Listinsert_L(LinkList &L,int i,ElemType e)
{
LinkList p,s;
int j;
p = L;
j = 0;
while(p && j<i-1)
{
p = p->next;
++j;
}
if(!p || j>i-1)
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); //生产新结点
s->data=e;
s->next=p->next;
p->next=s;
L->data++;
return OK;
}

//带头结点单链表的删除
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
LNode *p,*q;
int j;
p = L;
j=0;
while(p->next && j<i-1) //注意不能写成(p && 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;
//printf("%d",e);
free(q);
L->data--; //使链表中的元素个数减一
return OK;
}
//求单链表的长度的函数
void Length_L(LinkList L)
{
int num=0;
LinkList p;
p=L->next;
while(p)
{
num++;
printf("%3d",p->data);
p=p->next;
}
printf("\n这个单链表的长度为:%d",num);
}

//定义输出链表函数
Status Print_L(LinkList L)
{
LinkList p;
p=L->next;
printf("this list contains %d elements\n",L->data);
while(p)
{
printf("%4d->",p->data);
p=p->next;
}
printf("NULL\n");
return OK;
}

/*已知线性表中的元素以值递增有序排列,并以单链表作存储结构。
写一高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素)
同时释放被删节点空间,并分析算法时间复杂度。

(考虑当这个线性表不是有序排列该怎么办,那就写一个单链表的排序算法,
若单链表的元素无序,则先调用排序算法进行排序,再调用此算法进行删除)*/

Status Delete_Between(LinkList &L,int mink,int maxk)
{
LNode *p,*q;
p = L;
while(p->next && p->next->data<=mink)
p=p->next; //p是最后一个不大于mink的元素
if(p->next) //如果还有比mink更大的元素
{
q=p->next;
while(q->data<maxk)

{
q=q->next; //q是第一个不小于maxk的元素

L->data--;

}
p->next=q;
}
return OK;

}
//建立主函数
int main()
{
LinkList L;
int n=8,i,i_1,i_2,e,e_1,e_2,e_3,e_4;

//调用CreatList_L函数,创建一个单链表
//printf("Please input the number in the list:\n");
CreatList_L(L,n);
printf("\n");

//调用GetElem_L函数,查找单链表中的第i个元素,调用Length_L函数,求表长
printf("单链表中的数据为:\n");
Length_L(L);
printf("\n");
printf("\n请输入你要获取的元素序号:");
scanf("%d",&i);
GetElem_L(L,i,e);
printf("the %dth number is:%d",i,e);
printf("\n");

//调用Listinsert_L函数,实现元素插入功能,然后调用输出链表函数,输出插入后的链表
printf("清输入插入元素的位置:\n");
scanf("%d",&i_1);
printf("\n请输入要插入的元素:\n");
scanf("%d",&e_1);
Listinsert_L(L,i_1,e_1);
Print_L(L);
printf("\n");

//调用Delete函数,用来删除指定的元素,然后再调用Print_L函数输出删除元素后的链表
printf("请输入要删除的位置是:\n");
scanf("%d",&i_2);
ListDelete_L(L,i_2,e_2);
Print_L(L);
printf("\n");

//调用Delete_Between函数,用来删除指定两个元素之间的元素,然后调用Print函数,输出操作后的链表
printf("\n删除a和b之间的元素,请输入:");
scanf("%d%d",&e_3,&e_4);
Delete_Between(L,e_3,e_4);
Length_L(L);
Print_L(L);
printf("\n");

return 0;
}

posted on 2015-09-26 12:35  太自由  阅读(723)  评论(0编辑  收藏  举报