#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define SWAP(x,y) {t=x,x=y,y=t;}
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status Create_LinkList_Head(LinkList &L,int n)//头插法
{
LinkList s;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for(int i=0 ; i<n ; i++)
{
if(!(s=(LinkList)malloc(sizeof(LNode))))
{
printf("内存分配失败!");
exit(OVERFLOW);
}
scanf("%d",&s->data);
s->next=L->next;
L->next=s;
}
return OK;
}
Status Create_LinkList_Tail(LinkList &L,int n)//尾插法(顺序输出)
{
LinkList r,s;
L=(LinkList)malloc(sizeof(LNode));
r=L;
for(int i=0 ; i<n ; i++)
{
if(!(s=(LinkList)malloc(sizeof(LNode))))
{
printf("内存分配失败");
exit(OVERFLOW);
}
scanf("%d",&s->data);
r->next=s;
r=s;
}
r->next=NULL;
return OK;
}
Status Insert_LinkList(LinkList &L,int i,ElemType e)//插入节点
{
int j=0;
LinkList p=L,s;
while(j<i-1 && p)
{
p=p->next;
j++;
}
if(!p || j>i-1)
return ERROR;
if(!(s=(LinkList)malloc(sizeof(LNode))))
{
printf("内存分配失败");
exit(OVERFLOW);
}
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status Delete_LinkList(LinkList &L,int i,ElemType &e)//删除节点
{
int j=0;
LinkList p=L->next,q;
while(j<i-1 && p)
{
p=p->next;
j++;
}
if(!p || j>i-1)
return ERROR;
q=p->next;
e=q->data;
p->next=q->next;
free(q);
return OK;
}
Status GetElem_LinkList(LinkList &L,int i,ElemType &e)//得到指定的节点元素
{
int j;
LinkList p;
j=1,p=L->next;
while(j<i && p)
{
p=p->next;
j++;
}
if(!p || j>i)
return ERROR;
e=p->data;
return OK;
}
Status Print_LinkList(LinkList &L)//打印链表
{
LinkList p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return OK;
}
int LinkList_Length(LinkList &L)//获取链表的长度
{
int len=0;
LinkList p=L->next;
while(p)
{
len++;
p=p->next;
}
return len;
}
Status Destory_LinkList(LinkList &L)//销毁链表
{
LinkList p=L;
while(p)
{
free(p);
p=p->next;
}
free(L);
return OK;
}
Status Sort_LinkList(LinkList &L)//排序
{
LinkList La,Lb;
ElemType t;
La=L->next;
Lb=La->next;
while(Lb)
{
if(La->data>Lb->data)
{
SWAP(La->data,Lb->data);
}
Lb = Lb->next;
if(!Lb)
{
La = La->next;
Lb = La->next;
}
}
return OK;
}
int main()
{
int n,ch,pos;
ElemType insert;
LinkList L;
printf("请输入你要输入元素的个数\n");
scanf("%d",&n);
printf("输入1,选择头插法(顺序),输入2,选择尾插法(逆序)\n");
scanf("%d",&ch);
if(ch!=1 && ch!=2)
{
printf("输入错误,请重新输入");
scanf("%d",&ch);
}
if(ch==1)
{
printf("请输入%d个元素\n",n);
Create_LinkList_Head(L,n);
}
else if(ch==2)
{
printf("请输入%d个元素\n",n);
Create_LinkList_Tail(L,n);
}
printf("\n你创建的链表的长度为%d\n",LinkList_Length(L));
printf("请输入你要插入的数据和位子(之前)\n");
scanf("%d%d",&insert,&pos);
Insert_LinkList(L,pos,insert);
BubbleSort(L);
Sort_LinkList(L);
Print_LinkList(L);
return 0;
}
数据结构->第二章->线性表的链式表示和实现
来源:https://www.cnblogs.com/cjnwan/archive/2012/06/10/2543788.html