标签:
链表有两种类型.一种是带有表头的和不带有表头的,其实基本操作都差不多。只是在带有表头的链表中,第一个节点没放东西,属于浪费资源,但是便于插入和删除,主要针对的是第一个节点的操作。(个人习惯用带有表头的链表)
//链表的基本操作(带有表头) #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct node { ElemType data; struct node *next; }LNode, *LinkList; //初始化链表 (只建表头) void InitLinkList(LinkList &L) { LinkList p = NULL; if (NULL == L) { p = (LinkList)malloc(sizeof(LNode)); if (NULL == p) { printf("内存分配失败\n"); free(p); exit(0); } L = p; L->next = NULL; } else { printf("链表不为空,无需初始化\n"); exit(0); } } //插入元素 void InsertLinkList(LinkList &L, int nInsertPoint, ElemType nInsertValue) { LinkList p = NULL, r = NULL; int i = 0; if (NULL == L) { printf("表头为空,请先初始化\n"); exit(0); } r = (LinkList)malloc(sizeof(LNode)); if (NULL == r) { printf("内存分配失败\n"); free(r); exit(0); } r->data = nInsertValue; p = L; while ((NULL != p) && (i < nInsertPoint - 1)) //合法插入点,指针移动,定位到带插入点之前 { p = p->next; i++; } while ((NULL == p) || (i > nInsertPoint - 1)) //非法插入点。 前者:插入点越界; 后者:插入点<=0; { printf("非法插入点,请检查参数\n"); exit(0); } r->next = p->next; p->next = r; } //校验头指针和其next域是否为空 void CheckLinkList(LinkList L) { if (NULL == L) { printf("指针为空,请检查参数\n"); exit(0); } if (NULL == L->next) { printf("链表为空,无法销毁.\n"); exit(0); } } //输出链表 void PrintLinkList(LinkList L) { LinkList p = NULL; int i = 0; CheckLinkList(L); p = L->next; //注意:此处不是p = L; while (NULL != p) { printf("%d ", p->data); p = p->next; } printf("\n"); } //删除节点 void DeleteLinkList(LinkList &L, int nDeletePoint) { LinkList p = NULL, r = NULL; int i = 0; CheckLinkList(L); p = L; while ((NULL != p) && (i < nDeletePoint - 1)) //指针移动到删除点之前 { p = p->next; i++; } while ((NULL == p) || (i > nDeletePoint - 1)) //非法删除点。前者:是否越界; 后者:删除点是否<=0 { printf("非法删除点.\n"); exit(0); } //删除节点 r = p->next; p->next = r->next; free(r); } //销毁链表 void DestroyLinkList(LinkList &L) { LinkList p = NULL, r = NULL; CheckLinkList(L); p = L->next; //注意:此处不是p = L; while (NULL != p) { r = p; p = p->next; free(r); } printf("成功销毁链表\n"); } //通过查找点,查找元素值 (返回p->data) ElemType FindElem(LinkList L, int nFindPoint) { LinkList p = NULL; int i = 0; CheckLinkList(L); p = L; while ((NULL != p) && (i < nFindPoint)) { p = p->next; i++; } while ((NULL == p) || (i > nFindPoint) || 0 == nFindPoint) //非法查找点。前者:是否越界; 后者:删除点是否<=0 { printf("非法查找点.\n"); exit(0); } return p->data; } //通过元素查找,若存在,返回其位序,否则返回-1 int LocateElem(LinkList L, ElemType elem) { LinkList p = NULL; int nSeq = 1; CheckLinkList(L); p = L->next; while ((NULL != p) && (elem != p->data)) { nSeq++; p = p->next; } if (NULL == p) { return -1; //没找到 } else { return nSeq; } } int LengthOfLinkList(LinkList L) { LinkList p = NULL; int nLength = 0; CheckLinkList(L); p = L->next; while (NULL != p) { nLength++; p = p->next; } return nLength; } int main() { LinkList La = NULL; int nInsertCount; //待插入元素个数 int nInsertValue; //待插入元素值 int i = 0; InitLinkList(La); printf("请输入插入个数:"); scanf("%d", &nInsertCount); while (i < nInsertCount) { printf("为p->data赋值:"); scanf("%d", &nInsertValue); InsertLinkList(La, i + 1, nInsertValue); //插入元素 i++; } /*-------------测试查找------------- int x = FindElem(La, -1); printf("%d\n", x); */ /*-------------测试序号------------- int nSeq = LocateElem(La, 3); printf("%d\n", nSeq); */ /*-------------测试长度------------- int nLength = LengthOfLinkList(La); printf("%d\n", nLength); */ /*-------------测试删除------------- //删除前 PrintLinkList(La); //删除后 DeleteLinkList(La, 4); PrintLinkList(La); */ DestroyLinkList(La); return 0; }
本文转自:http://www.cnblogs.com/michaelGood/archive/2012/10/16/2725831.html
标签:
原文地址:http://www.cnblogs.com/gaowf/p/4246492.html