C语言线性数据结构——单链表的操作

在上一篇博客的基础上,我们继续深入学习线性数据结构,今天主要用c语言实现了单链表的增-删-改-查,创建链表时分别使用了头插法和尾插法,查询分为按值查询与链表序号查询。
编译:vc6

#include<stdio.h>
#include<stdlib.h>
//定义链表结构体
typedef struct student{
    
    
    int score;
    struct student *next;
} LinkList;

//定义一个创建节点的函数 尾插法
LinkList *Toilcreat(int n){
    
    
	int i;
    LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
    head = (LinkList*)malloc(sizeof(LinkList));//分配地址
    end = head;         //若是空链表则头尾节点一样
    for (i = 0; i < n; i++) {
    
    
        node = (LinkList*)malloc(sizeof(LinkList));
        scanf("%d", &node->score);
        end->next = node;
        end = node;
    }
    end->next = NULL;//结束创建
    return head;
};

//定义一个创建节点的函数 头插法
LinkList *Headcreat(int n){
    
    
	int i;
	LinkList *L,*s;  //定义指针L和辅助指针s
    L = (LinkList*)malloc(sizeof(LinkList));//分配地址
	L->next = NULL;
    for (i = 0; i < n; i++) {
    
    
        s = (LinkList*)malloc(sizeof(LinkList));
        scanf("%d", &s->score);
		s->next=L->next;
        L->next = s;
    }
    return L;
};

//定义一个修改指点节点元素的函数
void change(LinkList *list,int n) {
    
    //n为第n个节点
    LinkList *t = list;
    int i = 0;
    while (i < n && t != NULL) {
    
    
        t = t->next;
        i++;
    }
    if (t != NULL) {
    
    
        puts("输入要修改的值");
        scanf("%d", &t->score);
    }
    else {
    
    
        puts("节点不存在");
    }
}

//定义一个指定节点插入值的函数
void insert(LinkList *list, int n) {
    
    
    LinkList *t = list, *in;
    int i = 0;
    while (i < n && t != NULL) {
    
    
        t = t->next;
        i++;
    }
    if (t != NULL) {
    
    
        in = (LinkList*)malloc(sizeof(LinkList));
        puts("输入要插入的值");
        scanf("%d", &in->score);
        in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点
        t->next = in;//填充t节点的指针域,把t的指针域重新指向in
    }
    else {
    
    
        puts("节点不存在");
    }
}
//定义一个打印链表的函数
void ShowList(LinkList *h){
    
    
	while (h->next != NULL) {
    
    
        h = h->next;
        printf("%d  ", h->score);
	}
	printf("\n");
}
//定义一个查询指定位置元素的方法
void GetElement(LinkList *h,int n){
    
    
	int j=1;
	LinkList *p = h->next;	//第一个节点赋值给p
	if (n<=0)
		printf("Null");
	while(p&&j<n){
    
    
		p = p->next;
		j++;
	}
	printf("%d\n",p->score);
}
//定义一个按照值查询元素位置的方法
void GetId(LinkList *h,int x){
    
    
	int j=1,m=0;  //计数
	LinkList *p = h->next;	//第一个节点赋值给p
	while (p->next!= NULL){
    
    
		p = p->next;
		j++;
		if(p->score==x){
    
    
			printf("%d ",j);
			m++;
		}
	}
	if (m==0)
		printf("查询元素不存在!\n");
}

//定义一个删除链表节点的方法

void DeleteElment(LinkList *h,int n){
    
    
	LinkList *p=h,*q;
	int i=1;
	//1.取指向删除位置的前驱结点的指针
	while (i!=n){
    
    
		p = p->next;
		i++;
	}
	//2.取指向删除位置的指针
	q = p->next;
	//3.删除位置的前驱结点的指针后继指向删除位置指针前驱后继
	p->next = q->next;
	//4.释放删除节点
	free(q);
	
}


void main(){
    
    
	LinkList *h,*w;
	h = Headcreat(5);
	printf("头插法创建链表为:");
	ShowList(h);
	w = Toilcreat(5);
	printf("尾插法创建链表为:");
	ShowList(w);
	printf("删除链表第二个节点后:");
	DeleteElment(w,2);
	ShowList(w);
	printf("查询链表第二位元素为:");
	GetElement(w,2);
	printf("查询链表中值为2的元素位置为:");
	GetId(w,6);
	change(w,2);
	printf("修改链表中第二个节点后:");
	ShowList(w);
	insert(w,2);
	printf("链表中第二个节点插入后:");
	ShowList(w);
}

猜你喜欢

转载自blog.csdn.net/weixin_44230855/article/details/107578499