#include <stdio.h>
#include <stdlib.h>
//利用结构体创建节点
struct list{
//创建数据域
int data;
//创建指针域
struct list *next;
};
//实现建立一个节点的方法
struct list *create_list(){
return calloc(sizeof (struct list), 1);
}
//循环遍历链表
void traverse(struct list *ls){
struct list *p = ls;
while(p){
printf("%d\n", p->data);
p = p->next;
}
}
//在指定的位置插入元素
struct list *insert_list(struct list *ls, int n, int data){
struct list *p = ls;
//这里做的是遍历到要插入的节点
while (p && n--) {
p = p->next;
}
//说明n大于链表的节点数
if(p == NULL){
return NULL;
}
//建立一个新的节点
struct list *node = create_list();
node->data = data;
//先后再前
node->next = p->next;
p->next = node;
}
//删除指定位置的元素
int delete_list(struct list *ls, int n){
struct list *p = ls;
while(p && n--){
p = p->next;
}
if(p == NULL){
//n的位置不合适
return -1;
}
struct list *temp = p->next;
p->next = p->next->next;
free(temp);
return 0;
}
//返回链表元素的个数
int count_list(struct list *ls){
struct list *p = ls;
int count = 0;
while(p){
count++;
p = p->next;
}
return count;
}
//清空链表,只保留首节点
void clear_list(struct list *ls){
//因为要保留首节点,所以起始的位置为第二个节点
struct list *p = ls->next;
while(p){
struct list *temp = p->next;
free(p);
p = temp;
}
//将首节点的下一个节点设置为null
ls->next = NULL;
}
//查看链表是否为空
int empty_list(struct list *ls){
if(ls->next){
return 0;
}else{
return -1;
}
}
//返回链表指定位置的节点
struct list *locale_list(struct list *ls, int n){
struct list *p = ls;
while(p && n--){
p = p->next;
}
if(p == NULL){
return NULL;
}
return p;
}
//通过数据域寻找指针域,返回节点在链表中的位置
int data_list(struct list *ls, int data){
int index = 1;
struct list *p = ls;
while(p){
if(p->data == data){
return index;
}else{
p = p->next;
}
index++;
}
return 0;
}
//得到最后一个节点
struct list *last_list(struct list *ls){
struct list *p = ls;
while(p->next){
p = p->next;
}
return p;
}
//合并两个链表,但不合并链表头
void merge_list(struct list *ls1, struct list *ls2){
last_list(ls1)->next = ls2->next;
//链表头并不合并
free(ls2);
}
int main(void){
//在堆中创建一个节点
struct list *first = create_list();
struct list *second = create_list();
struct list *third = create_list();
first->next = second;
second->next = third;
third->next = NULL;
first->data = 1;
second->data = 2;
third->data = 3;
//测试遍历链表
traverse(first);
printf("---------------------\n");
//测试插入数据
insert_list(first, 1, 4);
traverse(first);
printf("---------------------\n");
//测试删除元素
delete_list(first, 1);
traverse(first);
printf("---------------------\n");
//测试返回元素的个数
int count = count_list(first);
printf("测试返回元素的个数: %d\n", count);
printf("---------------------\n");
//测试返回指定位置的节点
struct list *p = locale_list(first, 1);
printf("测试返回指定位置的节点: %d\n", p->data);
printf("---------------------\n");
//测试通过数据域查找指针域
if(data_list(first, 1)){
printf("Find\n");
}else{
printf("Not Find\n");
}
printf("%d\n", data_list(first, 4));
printf("---------------------\n");
//测试得到最后一个节点
printf("最后一个节点: %d\n", last_list(first)->data);
printf("---------------------\n");
//测试清空链表
clear_list(first);
traverse(first);
printf("---------------------\n");
//测试合并两个链表
struct list *first2 = create_list();
for(int i = 0; i < 10; i++){
insert_list(first, 0, i);
}
merge_list(first, first2);
traverse(first);
printf("---------------------\n");
return 0;
}
c实现功能(13)实现单向链表的简要功能
猜你喜欢
转载自blog.csdn.net/hc1151310108/article/details/83448554
今日推荐
周排行