首先我们定义一个单链表
typedef struct LNode { ElemType data; struct LNode* next; }LNode,*LinkList;
如下是对单链表进行各种操作的函数声明
//头插法 LinkList List_HeadInsert(LinkList &L); //尾插法 LinkList List_TailInsert(LinkList &L); //按序号查找结点值 LNode* GetElem(LinkList L, int i); //按值查找表的结点 LNode* LocateElem(LinkList L, ElemType e); //后插操作 bool InsertNextNode(LNode* p, ElemType e); //指定节点的前插操作 bool InsertPriorNode(LNode* p, LNode* s); //插入结点 bool ListInsert(LinkList &L, int i, ElemType e); //删除结点 bool ListDelete(LinkList &L, int i, ElemType &e); //求表的长度 int Length(LinkList L);
接下来我们看看这些操作是怎么实现的!
//头插法 LinkList List_HeadInsert(LinkList &L) { LNode* s; int x; L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; scanf("%d", &x); while (x != 9999) { s = (LNode*)malloc(sizeof(LNode)); s->data = x; s->next = L->next; L->next = s; scanf("%d", &x); } return L; } //尾插法 LinkList List_TailInsert(LinkList &L) { int x; L = (LinkList)malloc(sizeof(LNode)); LNode*s, *r = L; scanf("%d", &x); while (x != 9999) { s = (LNode*)malloc(sizeof(LNode)); s->data = x; r->next = s; r = s; scanf("%d", &x); } r->next = NULL; return L; } //按序号查找结点值 LNode* GetElem(LinkList L, int i) { int j = 1; LNode* p = L->next; if (i == 0)return L; if (i < 1) return NULL; while (p && j < i) { p = p->next; j++; } return p; } //按值查找表的结点 LNode* LocateElem(LinkList L, ElemType e) { LNode* p = L->next; while (p != NULL && p->data != e) p = p->next; return p; } //后插操作:在p结点之后插入元素e bool InsertNextNode(LNode* p, ElemType e) { if (p == NULL) return false; LNode *s = (LNode*)malloc(sizeof(LNode)); if (s == NULL) return false; s->data = e; s->next = p->next; p->next = s; return true; } //指定结点的前插操作 bool InsertPriorNode(LNode* p, LNode* s) { if (p == NULL || s == NULL) return false; s->next = p->next; p->next = s; ElemType temp = s->data; p->data = s->data; s->data = temp; return true; } //插入结点 bool ListInsert(LinkList &L, int i, ElemType e) { if (i < 1) return false; LNode* p = GetElem(L, i); return InsertNextNode(p, e); } //删除结点 bool ListDelete(LinkList &L, int i, ElemType &e) { if (i < 1)return false; LNode* p = GetElem(L, i - 1); if (p == NULL) return false; if (p->next == NULL)return false; LNode* q = p->next; e = q->data; p->next = q->next; free(q); return true; } //求表的长度 int Length(LinkList L) { int len = 0; LNode* p = L; while (p->next != NULL) { p = p->next; len++; } return len; }
当我们想要查看链表中的数据,那么可以增加一个PrintList函数来输出链表
void printList(LinkList L) { LNode* p = L->next; while (p !=NULL) { printf("%d\n", p->data); p = p->next; } }
*代码参照王道数据结构