c语言的链表用法,C语言链表常见用法

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

#include

#include

#include

#include

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 link

struct 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 node

head = link;

}

//delete first item

struct node* deleteFirst()

{

//save reference to first link

struct node * tempLink = head;

//mark next to first link as first

head = 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 pty

if (head == NULL)

{

return NULL;

}

//navigate through list

while (current->key != key) {

//if it is last node

if (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 link

struct node* current = head;

struct node* previous = NULL;

//if list is em pty

if (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 link

if (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) ]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值