如何用C语言编写循环链表实现长尾词的查询功能?

2026-04-19 01:242阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计850个文字,预计阅读时间需要4分钟。

如何用C语言编写循环链表实现长尾词的查询功能?

原文示例代码如下,供大家参考:

c#include

typedef struct Node { int data; struct Node *next;} Node;

如何用C语言编写循环链表实现长尾词的查询功能?

// 创建循环链表void createCircleList(Node **head) { Node *p=(Node *)malloc(sizeof(Node)); p->data=1; p->next=NULL; *head=p;

Node *r=*head; for (int i=2; i data=i; p->next=NULL; r->next=p; r=p; } r->next=*head; // 设置尾指针指向头指针,形成循环链表}

// 打印循环链表void printCircleList(Node *head) { Node *p=head; while (p !=NULL) { printf(%d , p->data); p=p->next; } printf(\n);}

int main() { Node *head; createCircleList(&head); printCircleList(head); return 0;}

注意事项:

1.循环链表设置尾指针指向头指针。

2.在链表操作过程中,尾指针会不断变化。

3.在某些函数中,需要使用尾指针来操作循环链表。

本文实例为大家分享了C语言实现循环链表的具体代码,供大家参考,具体内容如下

注意事项:

1、循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。
2、注意传递的实参需要取地址
3、循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点)
4、在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额外更新一次),直接用头插法建立的是头指针,而非尾指针

代码:

#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node * next; }Node, *LinkList; LinkList Creat(); void Destroy(LinkList *L); void Insert(LinkList *L, int val, int index); void Delete(LinkList *L, int index); void Traverse(LinkList L); int main() { LinkList L = Creat(); Traverse(L); Insert(&L, 1, 5); printf("After inserting is :\n"); Traverse(L); printf("After deleting is :\n"); Delete(&L, 2); Traverse(L); Destroy(&L); Traverse(L); } LinkList Creat() { LinkList L = (LinkList)malloc(sizeof(Node));//用L指针指向新建结点,这里L还不算尾指针 int n; L->data = -1; L->next = L;//头结点的指针域指向头结点, 注意!这里是对尾指针的初始化。 printf("Please enter the number you want input:(>5)"); scanf_s("%d", &n); printf("input the number:\n"); for (int i = 0; i < n; i++) { LinkList p = (LinkList)malloc(sizeof(Node)); scanf_s("%d", &p->data); p->next = L->next; L->next = p; L = p; } return L;//返回尾结点的指针 } void Destroy(LinkList *L) { LinkList q = (*L)->next->next; LinkList p; (*L) = (*L)->next; while (q != (*L)) { p = q->next; free(q); q = p; } (*L)->next = (*L); } void Insert(LinkList *L, int val, int index) { LinkList p = (LinkList)malloc(sizeof(Node)); p->data = val; LinkList q = (*L)->next; for (int i = 1; q != (*L) && i < index; i++) q = q->next; p->next = q->next; q->next = p; if (p == (*L)) (*L) = p; } void Delete(LinkList *L, int index) { LinkList q = (*L)->next, p; for (int i = 0; i < index; i++) q = q->next; p = q->next; q->next = p->next; free(p); } void Traverse(LinkList L) { LinkList q = L->next->next;//这才是首元结点 while (q != L) { printf("%d->", q->data); q = q->next; } printf("NULL\n"); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

本文共计850个文字,预计阅读时间需要4分钟。

如何用C语言编写循环链表实现长尾词的查询功能?

原文示例代码如下,供大家参考:

c#include

typedef struct Node { int data; struct Node *next;} Node;

如何用C语言编写循环链表实现长尾词的查询功能?

// 创建循环链表void createCircleList(Node **head) { Node *p=(Node *)malloc(sizeof(Node)); p->data=1; p->next=NULL; *head=p;

Node *r=*head; for (int i=2; i data=i; p->next=NULL; r->next=p; r=p; } r->next=*head; // 设置尾指针指向头指针,形成循环链表}

// 打印循环链表void printCircleList(Node *head) { Node *p=head; while (p !=NULL) { printf(%d , p->data); p=p->next; } printf(\n);}

int main() { Node *head; createCircleList(&head); printCircleList(head); return 0;}

注意事项:

1.循环链表设置尾指针指向头指针。

2.在链表操作过程中,尾指针会不断变化。

3.在某些函数中,需要使用尾指针来操作循环链表。

本文实例为大家分享了C语言实现循环链表的具体代码,供大家参考,具体内容如下

注意事项:

1、循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。
2、注意传递的实参需要取地址
3、循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点)
4、在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额外更新一次),直接用头插法建立的是头指针,而非尾指针

代码:

#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node * next; }Node, *LinkList; LinkList Creat(); void Destroy(LinkList *L); void Insert(LinkList *L, int val, int index); void Delete(LinkList *L, int index); void Traverse(LinkList L); int main() { LinkList L = Creat(); Traverse(L); Insert(&L, 1, 5); printf("After inserting is :\n"); Traverse(L); printf("After deleting is :\n"); Delete(&L, 2); Traverse(L); Destroy(&L); Traverse(L); } LinkList Creat() { LinkList L = (LinkList)malloc(sizeof(Node));//用L指针指向新建结点,这里L还不算尾指针 int n; L->data = -1; L->next = L;//头结点的指针域指向头结点, 注意!这里是对尾指针的初始化。 printf("Please enter the number you want input:(>5)"); scanf_s("%d", &n); printf("input the number:\n"); for (int i = 0; i < n; i++) { LinkList p = (LinkList)malloc(sizeof(Node)); scanf_s("%d", &p->data); p->next = L->next; L->next = p; L = p; } return L;//返回尾结点的指针 } void Destroy(LinkList *L) { LinkList q = (*L)->next->next; LinkList p; (*L) = (*L)->next; while (q != (*L)) { p = q->next; free(q); q = p; } (*L)->next = (*L); } void Insert(LinkList *L, int val, int index) { LinkList p = (LinkList)malloc(sizeof(Node)); p->data = val; LinkList q = (*L)->next; for (int i = 1; q != (*L) && i < index; i++) q = q->next; p->next = q->next; q->next = p; if (p == (*L)) (*L) = p; } void Delete(LinkList *L, int index) { LinkList q = (*L)->next, p; for (int i = 0; i < index; i++) q = q->next; p = q->next; q->next = p->next; free(p); } void Traverse(LinkList L) { LinkList q = L->next->next;//这才是首元结点 while (q != L) { printf("%d->", q->data); q = q->next; } printf("NULL\n"); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。