这个是我自己实现的一个带头节点的单链表:
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType elem;
struct LNode* next;
}LinkList;
Status Init(LinkList* head)
{
if(head == NULL)
{
return ERROR;
}
head->elem = 0;
head->next = NULL;
return OK;
}
Status Insert(LinkList* head, LinkList** curr, ElemType elem)
{
LinkList* node = (LinkList*) malloc(sizeof(LinkList));
if(!node)
{
return ERROR;
}
if((*curr)==NULL)
{
return ERROR;
}
node->elem = elem;
node->next = NULL;
(*curr)->next = node;
(*curr) = node;
head->elem++;
return OK;
}
Status Print(LinkList* head)
{
if(head == NULL)
{
return ERROR;
}
printf("Total %d elems\n", head->elem);
head = head->next;
while(head->next != NULL)
{
printf("%5d", head->elem);
head = head->next;
}
printf("%5d\n",head->elem);
return OK;
}
Status Del(LinkList* head, int index)
{
int i = 1;
LinkList* temp;
if(index < 0 || index > head->elem)
{
return ERROR;
}
head->elem--;
if(index == 1)
{
temp = head->next;
head->next = head->next->next;
}
else
{
head = head->next;
while(i < index - 1)
{
head = head->next;
i++;
}
temp = head->next;
head->next = head->next->next;
}
free(temp);
return OK;
}
void Free(LinkList* head)
{
LinkList* p = head;
while(p->next != NULL)
{
head = head->next;
free(p);
p = head;
}
free(p);
}
void main(void)
{
LinkList* head = (LinkList*) malloc(sizeof(LinkList));
LinkList* curr = head;
if(!head)
{
return ERROR;
}
Init(head);
Insert(head,&curr,1);
Insert(head,&curr,2);
Insert(head,&curr,3);
Insert(head,&curr,4);
Insert(head,&curr,5);
Insert(head,&curr,6);
Insert(head,&curr,7);
Print(head);
printf("\ndel 1st\n");
Del(head,1);
Print(head);
printf("\ndel 2nd\n");
Del(head,2);
Print(head);
printf("\ndel 3rd\n");
Del(head,3);
Print(head);
Free(head);
}
分享到:
相关推荐
对于带头结点和不带头结点的链表,主要区别在于初始化链表、插入第一个节点以及遍历链表的方法。 总的来说,单循环链表是数据结构中的基础工具,理解和掌握其原理和实现方式对于学习更复杂的算法和数据结构至关重要...
1. **带头结点的链表**:在带头结点的链表中,链表的起始有一个特殊的节点,称为头结点。头结点的数据域通常不存储实际的数据,而是用于方便操作。例如,插入和删除操作可以直接对头结点进行,无需考虑是否为空。...
/*尾插法创建一个带头结点链表*/ node *creat(node *head) { node *r,*s; int x; r=head; printf("在新链表中输入数据以0结束:"); scanf("%d",&x); while(x) { s=(node*)malloc(sizeof(node)); s->data=...
动态创建带头结点链表(尾插).cpp
已知head指向一个带头结点的单向链表, 链表中每个结点包含数据域(data)和指针域(next)。 请编写函数实现如图所示链表逆置
带头结点的链表在链表的起始位置添加一个特殊的结点,称为头结点。头结点不存储实际的数据,而是作为链表操作的入口,使得链表的操作更加方便。在循环链表中,头结点的指针通常指向链表中的第一个实际元素(即下一个...
为了实现带头结点的链表,我们需要一个额外的头结点,其数据部分通常不存储有效信息,而是用来方便操作链表。 接下来,我们需要实现链表的一些基本操作,如创建、插入、删除节点以及遍历链表。创建链表时,首先创建...
一个关于链表的小例子,希望有兴趣的可以下载看看,一起研究研究。
假设以带头结点的循环链表表示一个队列,并且只设一个队尾指针指向尾元素结点(注意不设头指针),试写出相应的置空队、入队、出队的算法。(Java描述)
在计算机科学领域,约瑟夫环(Josephus Problem)是一个著名的理论问题,它涉及到了循环链表和数据结构的操作。本程序以C/C++语言实现,利用带头结点的单向循环链表来解决这个问题。这里我们将深入探讨相关知识点。 ...
这两种实现方式均使用了带头结点的循环链表来表示队列,并且只设置了一个指向队尾元素的指针,实现了基本的队列操作如初始化、入队和出队等。通过上述分析,可以清晰地理解如何使用循环链表表示队列以及如何进行基本...
设ha和hb分别是指向两个带头结点的非递减...要求设计一个算法,将这两个有序链表合并成一个非递增(递减)有序的单链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其它存储空间。表中允许有重复的数据。
本文详细介绍了使用C语言实现带头结点的单向链表的基本操作,包括链表的创建、输出、插入元素和删除元素,以及单向链表的逆序连接和两个有序线性表的归并。 一、链表的创建 链表的创建是指在内存中分配一个结点,...
给定一个不带头结点的单链表,写出将链表倒置的算法
使用给定数据结构,实现带头结点的单向链表的创建、删除链表、插入结点等操作,每个学生的学号互不相同,学号不同而姓名相同则为不同的学生,每个学生的学号在合并后的链表中不重复,如果出现重复,则删除年龄较小...
一个不带头结点的链表意味着我们不会有一个额外的节点作为列表的起点,第一个节点就是列表的头。以下是一个简单的Node类实现: ```java public class Node { int data; Node next; public Node(int data) { ...
一个带头结点的单循环链表,结点类型为(data.next),以haed为头指针,每个结点的data域存放的是一个整数,试构造一个删除所有值大于min,小于max的结点的算法
带头结点的链表是指链表中有一个头结点,头结点不存储任何数据,它的作用是指向链表的第一个结点。使用带头结点的链表可以简化链表的创建和管理。 创建链表的步骤: 1. 创建一个带头结点的空链表 首先,我们需要...
C语言旅馆管理系统项目,主要使用带头结点链表存储数据,对链表元素排序,查找和删除,以及相应文件操作,模糊查找。进一步了解数据结构。.zip 项目资源具有较高的学习借鉴价值,也可直接拿来修改复现。可以在这些...