单链表

来源:互联网 发布:linux安装jdk报错 编辑:程序博客网 时间:2024/05/01 15:25

我觉得c语言学的好的没有几个不知道单链表  要想创建一个好的单链表需要考虑很多的因素 即使知道这是一个什么样相互关联的表 也很难十全十美的做出一个单链表 下面是我找到书上的一份单链表的程序  还算不错  希望以后我也能有这样的水平独自写出来  

单链表程序如下图:

#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 next = NULL;         // 用于保存当前结点的下一个结点指针// 将各个结点逆序while (cur){next = cur->next;cur->next = pre;pre = cur;cur = next;}// 处理头指针和尾结点(*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 ("%4d", 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, 1, 11) != OK){return ERROR;}DisPlay(head); */// 将第 pos 个结点删除/* if(Delete_Node(&head, 1) != 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;}
仔细看看 会发现许多细节处理的很不错  几乎都是指针和函数调用 努力学习 自己要独立写一份!加油!

0 0
原创粉丝点击