链表的基本操作
2015-05-05 19:42
375 查看
#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define INFEASIBLE -1 typedef int Status; typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; void InitList(LinkList &L); void DestroyList(LinkList &L); Status ListEmpty(LinkList L); int ListLength(LinkList L); int LocateElem(LinkList L,ElemType e,Status (* compare)(ElemType e1,ElemType e2)); Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e); Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e); Status InsertList(LinkList L,int i,ElemType e); Status DeleteList(LinkList L,int i,ElemType &e); void HeadCreList(LinkList &L,int n); void TailCreList(LinkList &L,int n); void ListTraverse(LinkList L,void (* visit)(ElemType e)); //辅助函数 bool equal(ElemType e1,ElemType e2); void print(ElemType e); /* 初始化链表 */ void InitList(LinkList &L) { L = (LinkList)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); L->data = NULL; L->next = NULL; } /* 销毁链表 */ void DestroyList(LinkList &L) { free(L); L = NULL; } /*判断链表是否为空*/ Status ListEmpty(LinkList L) { if(L) return TRUE; else return FALSE; } /*获取链表长度*/ int ListLength(LinkList L) { LinkList p = L->next; int i = 0; while(p) { p = p->next; i++; } return i; } /*找到指定元素在链表中的位置*/ int LocateElem(LinkList L,ElemType e,bool (* compare)(ElemType,ElemType)) { LinkList p = L->next; int i=1; while(p) { if(compare(p->data,e)) { return i; } p=p->next; i++; } return 0; } /* 找到指定结点的前驱 */ Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e) { LinkList q,p=L->next; while(p->next) { q = p->next; if(q->data==cur_e) { pre_e = p->data; return OK; } p = q; } return INFEASIBLE; } /* 找到指定结点的后继 */ Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e) { LinkList p = L->next; while(p->next) { if(p->data == cur_e) { next_e = p->next->data; return OK; } p = p->next; } return INFEASIBLE; } /* 链表的插入操作 */ Status InsertList(LinkList L,int i,ElemType e) { int j = 0; LinkList p = L,pnew; //找到前驱 while(j<i-1&&p) { p = p->next; j++; } if(!p || j>i-1) return ERROR; pnew = (LinkList)malloc(sizeof(LNode)); if(!pnew) exit(OVERFLOW); pnew->data = e; pnew->next = p->next; p->next = pnew; return OK; } /* 在链表中删除结点 */ Status DeleteList(LinkList L,int i,ElemType &e) { int j=0; LinkList p=L,q;//q用于指向要删除的结点 //找到第i个节点的前驱 while(j<i-1&&p->next) { p = p->next; j++; } //前驱是尾结点,或者没有找到指定结点的前驱 if(!(p->next)&&j>i-1) { return ERROR; } q = p->next; e = q->data; p->next = q->next; free(q); q = NULL; return OK; } /* 头插法创建链表 */ void HeadCreList(LinkList &L,int n) { LinkList temp; L = (LinkList)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); L->next = NULL; printf("please input %d elements.\n",n); for(int i=0;i<n;i++) { temp = (LinkList)malloc(sizeof(LNode)); if(!temp) exit(OVERFLOW); scanf("%d",&(temp->data)); temp->next = L->next; L->next = temp; } } /* 尾插法创建链表 */ void TailCreList(LinkList &L,int n) { LinkList temp,tail; L = (LinkList)malloc(sizeof(LNode)); if(!L) exit(OVERFLOW); L->next = NULL; tail = L; printf("please input %d elements.\n",n); for(int i=0;i<n;i++) { temp = (LinkList)malloc(sizeof(LNode)); if(!temp) exit(OVERFLOW); scanf("%d",&(temp->data)); temp->next = NULL; tail->next = temp; tail = temp; } tail->next = NULL; } /* 链表的遍历 */ void ListTraverse(LinkList L,void (* visit)(ElemType e)) { LinkList p = L->next; while(p) { visit(p->data); p=p->next; } printf("\n"); } /* 打印结点数据 */ void print(ElemType e) { printf("%d ",e); } /* 判断是否相等 */ bool equal(ElemType e1,ElemType e2) { if(e1==e1) return true; else return false; } //测试各个基本功能 void main() { LinkList L; int num; printf("请输入要创建的链表的长度:"); scanf("%d",&num); printf("----------------------------头插法创建链表------------------------------\n"); HeadCreList(L,num); printf("创建链表后链表的长度为%d\n",ListLength(L)); printf("链表中的数据为:"); ListTraverse(L,print); printf("----------------------------尾插法创建链表------------------------------\n"); //DestroyList(L); TailCreList(L,num); printf("创建链表后链表的长度为%d\n",ListLength(L)); printf("链表中的数据为:"); ListTraverse(L,print); ElemType SearchItem; printf("请输入查找的数据:"); scanf("%d",&SearchItem); printf("%d在链表中的位置为%d\n",SearchItem,LocateElem(L,SearchItem,equal)); printf("---------------------------插入数据测试-----------------------------\n"); ElemType InsertItem; int InsertPos; printf("请输入要插入数据位置和数据:"); scanf("%d",&InsertPos); scanf("%d",&InsertItem); InsertList(L,InsertPos,InsertItem); printf("插入%d后链表的数据为\n",InsertItem); ListTraverse(L,print); printf("--------------------------删除数据测试------------------------------\n"); int DelePos; ElemType DeleItem; printf("请输入删除数据所在的位置:"); scanf("%d",&DelePos); DeleteList(L,DelePos,DeleItem); printf("删除%d后链表中的数据为:",DeleItem); ListTraverse(L,print); }
-
相关文章推荐
- 数据结构——几种链表基本操作
- 单链表基本操作总结
- 链表,顺序表的基本操作及其实现的栈与队列
- 链表基本操作及其反转
- 单链表的基本操作
- Java实现单链表插入删除等基本操作
- 数据结构链表基本操作
- 带头结点的单链表的12个基本操作
- 【数据结构】 单链表的基本操作+反转+选择/直接插入/冒泡3种排序
- 数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)
- 链表基本操作
- 实例讲解C++ 双链表基本操作
- 链表的基本操作(Basic Operations on a Linked List)
- 双向链表的建立及基本操作
- 链表的基本操作
- 数据结构 - 单链表的基本操作 (C语言)
- 链表基本操作
- 链表基本操作java实现
- C语言实现链表的基本操作
- HNCU1326:算法2-8~2-11:链表的基本操作