链表基本操作
来源:互联网 发布:win8系统修复软件 编辑:程序博客网 时间:2024/06/12 21:03
链表就是C中利用结构体,将数据和下一个结构体的地址封装在一个结构体中形成一个节点,这些节点组合起来就是一个基础的链表,根据需要可以扩展其中的内容来实现不同的需求。
实现一个链表需要定义节点,创建,初始化,插入,删除这些基本操作。
#include "stdafx.h"#include "stdlib.h"#include "malloc.h"#define OK 0#define ERRO 1typedef int DataType;typedef int Status;typedef struct LNode { DataType data; struct LNode *next; }LNode,*LPoint;//表尾插入Status CreateLink(LPoint &L, int n, DataType *E) { int i; LPoint p, r; L = (LPoint)malloc(sizeof(LNode)); if (!L) return ERRO; r = L; for (i = 0; i < n; i++) { if (!(p = (LPoint)malloc(sizeof(LNode)))) return ERRO; p->data = E[i]; r->next = p; r = p; //尾指针右移保持指向末尾 } r->next = NULL; //无节点插入记得置为NULL指针 return OK;}Status InsertLink(LPoint &L, int i, DataType e) { //在第i个位置前插入e LPoint in, p = L; int counter = 0; //找第i-1个位置 while (p->next != NULL && counter < i - 1) { p = p->next; counter++; } //这些变化需先判断再执行,方便下一个越界判断 if (!p->next || counter>i-1) return ERRO; //超出范围 //p->next ==NULL 说明往后越界,counter >i-1 说明往前越界 if (!(in = (LPoint)malloc(sizeof(LNode)))) return ERRO;//内存不足 in->data = e; in->next = p->next; p->next = in; return OK;}Status DelLink(LPoint L, int i, DataType e) { //删除第i个元素,由e返回它的值 int counter = 0; LPoint del, p = L; while (p->next != NULL && counter < i - 1) { p = p->next; counter++; } if (!p->next || counter > i - 1) return ERRO;//越界 del = p->next; p->next = del->next; e = del->data; free(del); return OK;}void PrintLink(LPoint L) { LPoint p = L->next; while (p) { printf("%d->", p->data); p = p->next; } printf("NULL\n");}int main(){ int S[] = { 1,2,42,31,21 }; LPoint Link = NULL; CreateLink(Link, 5, S); PrintLink(Link); return 0;}
这是一个带头结点的链表,基本操作都差不多。注意若是C来实现的话,头结点需要定义为二级指针,因为在函数里面改变了指针的指向,C++可以传引用,C就只能用二级指针来指了。
阅读全文