单向链表的节点结构以及部分函数的实现(带头结点)
1.链表节点的结构
typedef int ElemType; typedef struct Node {
//用联合体是为了不浪费头节点的data域,用来记录长度. union { ElemType data;//数据 int length; }; struct Node* next; }HSNode,*HLinkList;
2.需要实现的部分函数
//初始化
void InitHLinkList(HLinkList head); //插入 bool InsertHLinkListPos(HLinkList head,ElemType value,int pos);//按位置插入数据 bool InsertHLinkListHead(HLinkList head, ElemType value);//头插 bool InsertHLinkListRear(HLinkList head, ElemType value);//尾插 //删除 bool DeleteHLinkListPos(HLinkList head, int pos);//按位置删 bool DeleteHLinkListHead(HLinkList head);//删头 bool DeleteHLinkListRear(HLinkList head);//删尾 bool DeleteHLinkListValue(HLinkList head, ElemType Value);//按值删除 bool Empty(HLinkList head);//判空 int HLength(HLinkList head);//长度 void Show(HLinkList head);//打印 void DestoryHLinkList(HLinkList head); void Reverse(HLinkList head);//逆置 void Reverse2(HLinkList head);
3.具体实现
#include<stdio.h> #include<stdlib.h> #include"linklisthead.h" static HLinkList ApplySpace(HLinkList head, ElemType value) { HLinkList new_node = (HLinkList)malloc(sizeof(HSNode)); if (nullptr == new_node) { return nullptr; } new_node->data = value; new_node->next = head; return new_node; } void InitHLinkList(HLinkList head) { if (nullptr == head) exit(0); head->length = 0; head->next = nullptr; } //插入 bool InsertHLinkListPos(HLinkList head,ElemType value,int pos) { if (nullptr == head) exit(0); if (pos < 0 || pos > head->length) { printf("Insert Fail: Pos Error !\n"); exit(0); } HLinkList p = head; while (pos > 0) { p = p->next; pos--; } HLinkList new_node = ApplySpace(p->next, value); if (nullptr == new_node) { printf("Insert Fail: Apply Fail !\n"); exit(0); } p->next = new_node; head->length++;//别忘l length += 1; return true; } bool InsertHLinkListHead(HLinkList head, ElemType value) { return InsertHLinkListPos(head, value,0); } bool InsertHLinkListRear(HLinkList head, ElemType value) { return InsertHLinkListPos(head, value, HLength(head)); } //删除 bool DeleteHLinkListPos(HLinkList head, int pos) { if (nullptr == head) exit(0); if (Empty(head)) { printf("Delete Fail: HLinkList Empty !\n"); exit(0); } if (pos < 0 || pos > HLength(head)) { printf("Delete Fail: Pos Error !\n"); exit(0); } HLinkList p = head;//带入一个节点进行判断;如 0 节点 while (pos > 0) { p = p->next; pos--; } HLinkList q = p->next; p->next = q->next; free(q); //HLinkList tmp1 = head->next; //error //while (pos > 0) //{ // tmp1 = tmp1->next; // pos--; //} //HLinkList tmp2 = tmp1; //tmp1->next= tmp2->next; //free(tmp2); head->length--; return true; } bool DeleteHLinkListHead(HLinkList head) { return DeleteHLinkListPos(head, 0); } bool DeleteHLinkListRear(HLinkList head) { return DeleteHLinkListPos(head, HLength(head)-1); } bool DeleteHLinkListValue(HLinkList head, ElemType value)//再看看 { if (nullptr == head) exit(0); if (Empty(head)) { printf("Delete Fail: List Empty \n"); exit(0); } HLinkList p = head; HLinkList q = p->next; while (q != nullptr) { if (q->data == value) { head->length--; p->next = q->next; free(q); } else { p = q; } q = p->next; } return true; } void DestoryHLinkList(HLinkList head) { if (head == nullptr) exit(0); while (!Empty(head)) { DeleteHLinkListHead(head); } } bool Empty(HLinkList head) { return head->length == 0; } int HLength(HLinkList head) { if (nullptr == head) return -1; return head->length; } void Show(HLinkList head) { if (nullptr == head) { exit(0); } HLinkList p = head->next; while (p != nullptr) { printf("%d ", p->data); p = p->next; } printf("\n"); } void Reverse(HLinkList head) { if (nullptr == head) exit(0); if (HLength(head) <= 1) exit(0); HLinkList p = head->next; HLinkList q = p->next; HLinkList s = nullptr; while (p != nullptr) { p->next = s; s = p; p = q; if (q != nullptr) q = q->next; } head->next = s; } void Reverse2(HLinkList head)//头插法 { if (nullptr == head) exit(0); if (HLength(head) <= 1) exit(0); HLinkList p = head->next; HLinkList q = nullptr; while (p != nullptr) { InsertHLinkListHead(q, p->data); p = p->next; } }
ps:代码是运行过,才转移上来.可以直接复制(若需要).其中有什么不对的地方,望告知谢谢各位大佬.

浙公网安备 33010602011771号