链表初解(一)——单链表的创建、删除、插入、测长、排序、逆置

来源:互联网 发布:淘宝开店培训班 平顶山 编辑:程序博客网 时间:2024/05/22 03:09

由于考试需要,复习一下单链表的各种常见操作,直接上代码+注释,需要的可以参考下哈~

Code:

#include<iostream>using namespace std;typedef struct student{int data;struct student *next;}node;//创建单链表node *create(){node *head, *p, *s;int x;head = (node *)malloc(sizeof(node));//先创建一个头节点,便于头指针的操作。p = head;printf("\nInput the data (end with '0') : ");while(1){if(scanf("%d", &x) != EOF && x != 0){//如果输入数据合法,则再创建一个节点;否则跳出循环。s = (node *)malloc(sizeof(node));s->data = x;p->next = s;p = s;}else break;}head = head->next;p->next = NULL;return head;}//计算单链表长度int length(node *head){int n = 0;while(head != NULL){head = head->next;n++;}return n;}//打印单链表void print(node *head){int n = length(head);printf("Output the list (%d records~) : ", n);while(head != NULL){printf(head->next == NULL ? "%d\n" : "%d->", head->data);head = head->next;}}//删除单链表节点node *del(node *head, int num){node *p1, *p2;if(head == NULL) return NULL;p1 = head;while(num != p1->data && p1->next != NULL){//若当前指针所存储的值与要删除的值不符,则向后遍历,直至相等或至最后一个节点。p2 = p1;p1 = p1->next;}if(num == p1->data){//如果链表中存在要删除的节点,则分两种情况:在头节点处或链表中。if(head == p1) head = p1->next;else p2->next = p1->next;free(p1);//别忘了释放删除的节点哦~节约点~}else printf("There is no '%d' \n", num);//找不到要删除的值。return head;}//插入单链表节点node *insert(node *head, int num){node *p1, *p2, *p3;p2 = head;p1 = (node *)malloc(sizeof(node));//先将要插入的节点申请下~p1->data = num;//思路同删除节点操作while(num > p2->data && p2->next != NULL) {p3 = p2;p2 = p2->next;}if(num <= p2->data){if(head == p2){p1->next = p2;head = p1;}else{p3->next = p1;p1->next = p2;}}else {//此处要细心,别忘了可以在尾部插入节点。p2->next = p1;p1->next = NULL;}return head;}//单链表排序node *sort(node *head){node *p;p = head;int n, temp;n = length(head);//运用冒泡排序似乎对链表排序来说是最方便的~(递增)for(int j = 1; j < n; j++){p = head;for(int i = 0; i < n - j; i++){if(p->data > p->next->data){temp = p->data;p->data = p->next->data;p->next->data = temp;}p = p->next;}}printf("\nAfter sorting ~\n");return head;}//单链表逆置node *reverse(node *head){node *p1, *p2, *p3;p1 = head;p2 = p1->next;if(head == NULL || head->next == NULL) return head;//逆置的思想:选出三个节点(第三个可能是NULL),操作前两个节点,使其逆置,而后按同样做法操作第二、三个节点和第四个节点~while(p2 != NULL){p3 = p2->next;p2->next = p1;p1 = p2;p2 = p3;}head->next = NULL;head = p1;printf("\nAfter reversing ~\n");return head;}int main(){node *head;//创建单链表head = create();print(head);//排序head = sort(head);print(head);//删除单链表int numD;printf("\nInput the value you want to delete : ");scanf("%d", &numD);head = del(head, numD);print(head);//插入单链表int numS;printf("\nInput the value you want to insert : ");scanf("%d", &numS);head = insert(head, numS);print(head);//逆置head = reverse(head);print(head);return 0;}
运行示例:

Ps:仅供参考哈~

14 0
原创粉丝点击