C语言链表常见用法

来源:互联网 发布:强制远程控制软件 编辑:程序博客网 时间:2024/06/06 11:00

           链表是一种数据结构序列,它通过链环连接在一起。链环包含不同数据。每个链环包含有对其它链环的链接。链表是除数组之外使用最广的数据结构,其常见用法示例如下:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stdbool.h>struct node{int data; int key;struct node * next;};struct node * head = NULL;struct node * current = NULL;//display the list void printList(){struct node * ptr = head;printf("\n[ ");//start from the beginning while (ptr != NULL){printf("(%d,%d) ", ptr->key, ptr->data);ptr = ptr->next;}printf(" ]");}//insert link at the first location void insertFirst(int key, int data){//create a linkstruct node * link = (struct node*) malloc(sizeof(struct node));link->key = key;link->data = data;//point it to old first node link->next = head;//point first to new first nodehead = link;}//delete first itemstruct node* deleteFirst(){//save reference to first link struct node * tempLink = head;//mark next to first link as firsthead = head->next;//return the deleted link return tempLink;}//is list empty bool isEmpty(){return head == NULL;}int length(){int length = 0;struct node * current;for (current = head; current != NULL; current = current->next){length++;}return length;}//find a link with given key struct node* find(int key) {//start from the first link struct node* current = head;//if list is em ptyif (head == NULL){return NULL;}//navigate through listwhile (current->key != key) {//if it is last nodeif (current->next == NULL) {return NULL;}else {//go to next link current = current->next;}}//if data found, return the current Link return current;}//delete a link with given key struct node* delete(int key) {//start from the first linkstruct node* current = head;struct node* previous = NULL;//if list is em ptyif (head == NULL) {return NULL;}//navigate through list while (current->key != key) {//if it is last node if (current->next == NULL) {return NULL;}else {//store reference to current link previous = current;//move to next link current = current->next;}}//found a match, update the linkif (current == head) {//change first to point to next link head = head->next;}else {//bypass the current link previous->next = current->next;}return current;}void sort() {int i, j, k, tempKey, tempData;struct node * current;struct node * next;int size = length();k = size;for (i = 0; i < size - 1; i++, k--) {current = head;next = head->next;for (j = 1; j < k; j++) {if (current->data > next->data) {tempData = current->data;current->data = next->data;next->data = tempData;tempKey = current->key;current->key = next->key;next->key = tempKey;}current = current->next;next = next->next;}}}void reverse(struct node* * head_ref) {struct node* prev = NULL;struct node* current = *head_ref;struct node* next;while (current != NULL) {next = current->next;current->next = prev;prev = current;current = next;}*head_ref = prev;}int main() {insertFirst(1, 10);insertFirst(2, 20);insertFirst(3, 30);insertFirst(4, 1);insertFirst(5, 40);insertFirst(6, 56);printf("Original List: ");//print list printList();while (!isEmpty()) {struct node * temp = deleteFirst();printf("\nDeleted value:");printf("(%d,%d) ", temp->key, temp->data);}printf("\nList after deleting all item s: ");printList();insertFirst(1, 10);insertFirst(2, 20);insertFirst(3, 30);insertFirst(4, 1);insertFirst(5, 40);insertFirst(6, 56);printf("\nRestored List: ");printList();printf("\n");struct node * foundLink = find(4);if (foundLink != NULL) {printf("Elem ent found: ");printf("(%d,%d) ", foundLink->key, foundLink->data);printf("\n");}else {printf("Elem ent not found.");}delete(4);printf("List after deleting an item : ");printList();printf("\n");foundLink = find(4);if (foundLink != NULL) {printf("Elem ent found: ");printf("(%d,%d) ", foundLink->key, foundLink->data);printf("\n");}else {printf("Elem ent not found.");}printf("\n");sort();printf("List after sorting the data: "); printList();reverse(&head);printf("\nList after reversing the data: "); printList();return 0;}

编译并运行以上程序,结果如下:

Original List: [ (6,56) (5,40) (4,1) (3,30) (2,20) (1,10) ] Deleted value:(6,56) Deleted value:(5,40) Deleted value:(4,1)Deleted value:(3,30) Deleted value:(2,20) Deleted value:(1,10)List after deleting all items: [ ]Restored List: [ (6,56) (5,40) (4,1) (3,30) (2,20) (1,10) ] Element found: (4,1) List after deleting an item: [ (6,56) (5,40) (3,30) (2,20) (1,10) ]Element not found.List after sorting the data: [ (1,10) (2,20) (3,30) (5,40) (6,56) ]List after reversing the data: [ (6,56) (5,40) (3,30) (2,20) (1,10) ]


4 0
原创粉丝点击