数据结构——链表

xiaoxiao2021-02-28  72

#include <stdio.h> #include <stdlib.h> #define OK            0 #define ERROR        -1 #define MALLOC_ERROR -2  typedef int ElementType; typedef struct node { ElementType data;    // 结点的数据 struct node *next;   // 结点指针 }Node; typedef Node *PNode;     // 重命名结点指针类型 // 头插法创建链表 //int Create_List_Head(struct node ** head, ElementType data) int Create_List_Head(PNode *h, ElementType data) { // 创建一个新的结点 //struct node * node = (struct node *)malloc(sizeof(Node)/sizeof(char)); PNode p = (PNode)malloc(sizeof(Node)/sizeof(char)); if (p == NULL) { return MALLOC_ERROR; } // 将新数据赋给新结点 p->data = data; p->next = *h; *h = p; } // 尾插法创建链表 int Create_List_Tail(PNode *h, ElementType data) { PNode node = (PNode)malloc(sizeof(Node)/sizeof(char)); if (node == NULL) { return MALLOC_ERROR; } node->data = data; node->next = NULL; // 将node加入到链表最后,此处要考虑是否非空表   if (*h == NULL)   // 空表 { *h = node; else              // 非空表 { PNode temp = *h; // 找最后一个结点 while (temp->next) { temp = temp->next; } temp->next = node; } return OK; } // 在第 pos 个结点处插入一个数据 int Insert_Node(PNode *h, int pos, ElementType data) { PNode temp = *h; int k=1; // 找第pos-1个结点 while (temp && k < pos-1) { temp=temp->next; k++; } // 非空表 if (temp == NULL && *h != NULL) { printf ("给的位置无效\n"); return ERROR; } // 新建结点 PNode node = (PNode)malloc(sizeof(Node)/sizeof(char)); if (node == NULL) { return MALLOC_ERROR; } node->data = data; // 将结点插入到链表中 if (*h == NULL || pos == 1)  // 插在表前   { node->next = *h; *h = node; else                         // 插在表中或末尾   { node->next = temp->next; temp->next = node; } return OK; } // 将第 pos 个结点删除 int Delete_Node(PNode *h, int pos) { if (*h == NULL) { printf ("空表,无法删除数据\n"); return ERROR; } PNode p = *h; int k = 1; while (p && k < pos-1) { p = p->next; k++; } if (p == NULL || k > pos-1) { printf ("无效的结点\n"); return ERROR; } PNode temp = p; if (pos == 1) { *h = p->next; } else {    temp = p->next; p->next = temp->next; } free(temp); temp = NULL; return OK; } // 链表逆序 int Inverse_List(PNode *h) { // 如果是空链表或者只有一个结点的链表默认为已逆序 if (*h == NULL || (*h)->next == NULL) { return OK; } PNode pre  = *h;           // 当前结点的前一个结点:初始化为指向第一个结点的指针   PNode cur  = pre->next;    // 当前结点:初始化为指向第二个结点的指针 PNode temp = NULL;         // 用于保存当前结点的下一个结点指针 // 将各个结点逆序 while (cur) { temp = cur->next;  //储存cur的下一个节点指针 cur->next = pre;    //逆序 pre = pre->next; //移位 cur = temp; } // 处理头指针和尾结点 (*h)->next = NULL;   // 原来的第一个结点现在是最后一个结点 要将其指针置空 *h = pre;            // 头指针指向现在的第一个结点也就是原来的最后一个结点 return OK; } // 查找链表中的元素,找到后返回改结点的指针 PNode Search(PNode h, ElementType data) { if (h == NULL) { return NULL; } PNode temp = h; while(temp) { if (temp->data == data) { return temp; } temp = temp->next; } return NULL; } // 计算链表的长度 int ListLen(PNode h) { int len = 0; while (h) { h = h->next; len++; } return len; } // 打印 void DisPlay(PNode head) { if (head == NULL) { printf ("该链表是空表!\n"); return; } PNode temp = head; while (temp) { printf ("M", temp->data); temp = temp->next; } printf ("\n"); } int main() { PNode head = NULL; // 头插法创建链表 int i = 0; for (i = 0; i < 10; i++) { // 头插法创建链表 /* if (Create_List_Head(&head, i) != OK) { return ERROR; } */ // 尾插法创建链表   if (Create_List_Tail(&head, i) != OK) { return ERROR; } DisPlay(head); // 在第 pos 个结点处插入一个数据   if(Insert_Node(&head, 5, 11) != OK) { return ERROR; } DisPlay(head);  // 将第 pos 个结点删除   if(Delete_Node(&head, 5) != OK) { return ERROR; } DisPlay(head);  // 将链表逆序 if(Inverse_List(&head) != OK) { return ERROR; } DisPlay(head); // 查找链表中的元素,找到后返回改结点的指针 PNode p = Search(head, 18); if (p == NULL) { printf ("无此结点\n"); } else { printf("node data = %d\n", p->data); } // 计算链表的长度 int len = ListLen(head); printf ("len = %d\n", len); return 0; }
转载请注明原文地址: https://www.6miu.com/read-65941.html

最新回复(0)