对于链表,指的是线性逻辑结构的顺序存储,数据元素之间的逻辑关系通过指针进行表示。在存储当前结点的同时存储前驱结点和后继结点的地址。
下面是通过vs2022实现带头结点的单链表的相关操作代码:
1.结点数据类型构造
typedef int data_t;
typedef struct node {
data_t data; //结点的数据域,存储当前结点的数据
struct node* next; //结点的指针域,存储下一个结点空间的地址
}Node;
2.创建头结点
Node* CreateLinkList(void) {
Node* head; //创建头结点
head = malloc(sizeof(Node)); //为头结点开辟空间
if (head == NULL)
return NULL;
memset(head, 0, sizeof(Node)); //为头结点的内存中的全部赋0值
head->next = NULL; //此时链表中没有其他结点元素,头结点指向NULL
return head;
}
3.遍历单链表
遍历链表指的是从第一个有效结点开始往后依次访问输出各个结点的数据域。
void DisplayLinkList(Node* head) {
Node* p = head->next; //起始结点
while (p != NULL) {
printf("%d ", p->data); //依次遍历各个结点的数据
p = p->next; //指向下一个结点
}
printf("\n");
4.创建插入函数
int InsertLinkList(Node* head, int local, data_t mydata) {
int i;
//找到插入结点的前一个结点,其地址是head
Node* p = head;
Node* q;
for (i = 0; i < local; i++) {
if (p == NULL)
return -1;
p = p->next; //将结点往后偏移
}
//创建插入元素数据结点,将其初始化
q = malloc(sizeof(Node));
if (q == NULL)
return -1;
memset(q, 0, sizeof(Node));
q->data = mydata;
//插入结点
q->next = p->next;
p->next = q;
return 0;
}
5.创建删除结点函数
int DeleteLinkList(Node* head, int local) {
int i;
Node* p=head;
Node* q;
//判断链表是否为空
if (p->next == NULL)
return -1;
//找到删除结点的前一个结点
for (i = 0; i < local; i++) {
p = p->next;
if (p->next == NULL)
return -1;
}
//删除结点
q = p->next;
p->next = q->next;
free(q); //释放删除节点的空间
return 0;
}