#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; }
数据结构->第二章->线性表的链式表示和实现