单链表的基本操作实现

定义

链表节点长这个样子,数据域data指针域next指向下一个结点

typedef struct lnode {
	int data;
	struct lnode *next;
}lnode ,*linklist;

初始化


/*初始化*/ 
linklist f1(){
	linklist l=(linklist)malloc(sizeof(lnode));
	l->next=NULL;
	return l;
}

int main(){
	linklist l;
	l=f1();
}

初始化的结果,头结点为l的空链表

给链表输入数据

头插法

void f2(lnode*l,int n){
	for(int i=0;i<n;i++){
		lnode* p=(linklist)malloc(sizeof(lnode));
		printf("请输入第%d个数",i+1);
		scanf("%d",&p->data);
		p->next=l->next;
		l->next=p;
	}
	F();
}

头插法插入元素链表元素是相反的

改良一下

void f2(lnode*l,int n){
	for(int i=0,j=n;i<n;i++,j--){
		lnode* p=(linklist)malloc(sizeof(lnode));
		printf("请输入第%d个数",j);
		scanf("%d",&p->data);
		p->next=l->next;
		l->next=p;
	}
	F();
}

尾插法

void f4(linklist l,int n){
	lnode *r;//尾指针
	r=l; 
	for(int i=0;i<n;i++){
		lnode* p=(linklist)malloc(sizeof(lnode));
		printf("请输入第%d个数",i+1);
		scanf("%d",&p->data);
		p->next=NULL;
		r->next=p;
		r=p;		
	} 
	F();
}

查找

按值查找

void f5(linklist l, int e) {
    lnode *p;
    p = l;
    int i = 1;
    while (p) {
        if (p->data == e) {
            printf("%d 在第 %d 个位置", e, i);
            break;
        }
        p = p->next;
        i++;
    }
    if (!p) {
        printf("元素 %d 不在链表中。", e);
    }
    F();
}

按位查找

void f6(linklist l,int i){
	int length=1;
	lnode *p,*q;
	int ii=1;
    p = l;
    q=l->next;
	while(p){
		p=p->next;
		length++;
	}
	if(i>length)
	printf("位置输入不合法");
	while (q){
		if(ii==i){
			printf("第%d个是%d",i,q->data);
		}
		q=q->next;
		ii++;
	}
	F();
}

给指定位置i插入元素e

void f7(linklist l,int i,int e){
	lnode *p=(lnode*)malloc(sizeof(lnode));
	p->data=e;
	for(int ii=1;ii<i;ii++)
	l=l->next;
	p->next=l->next;
	l->next=p;
}

删除指定位置的元素

void f8(linklist l,int i){
	lnode *p=(lnode*)malloc(sizeof(lnode));
	for(int ii=1;ii<i;ii++)
	l=l->next;
	p=l;
	l->next=l->next->next;	
}

完整代码

#include <stdio.h>
#include <stdlib.h>
typedef struct lnode {
	int data;
	struct lnode *next;
}lnode ,*linklist;
void F(){
	printf("\n");
	printf("------------------------");
	printf("\n");
}
/*初始化*/ 
linklist f1(){
	linklist l=(linklist)malloc(sizeof(lnode));
	l->next=NULL;
	return l;
}
/*头插法*/
void f2(lnode*l,int n){
	for(int i=0,j=n;i<n;i++,j--){
		lnode* p=(linklist)malloc(sizeof(lnode));
		printf("请输入第%d个数",j);
		scanf("%d",&p->data);
		p->next=l->next;
		l->next=p;
	}
	F();
}
/*输出链表*/
void f3 (linklist l){
	lnode *p;
	p=l->next;//跳过头结点 
	printf("链表是");
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
	F();
}
/*尾插法*/
void f4(linklist l,int n){
	lnode *r;//尾指针
	r=l; 
	for(int i=0;i<n;i++){
		lnode* p=(linklist)malloc(sizeof(lnode));
		printf("请输入第%d个数",i+1);
		scanf("%d",&p->data);
		p->next=NULL;
		r->next=p;
		r=p;		
	} 
	F();
}
/*按值查找 */ 
void f5(linklist l, int e) {
    lnode *p;
    p = l;
    int i = 1;
    while (p) {
        if (p->data == e) {
            printf("%d 在第 %d 个位置", e, i);
            break;
        }
        p = p->next;
        i++;
    }
    if (!p) {
        printf("元素 %d 不在链表中。", e);
    }
    F();
}
/*按位查找*/
void f6(linklist l,int i){
	int length=1;
	lnode *p,*q;
	int ii=1;
    p = l;
    q=l->next;
	while(p){
		p=p->next;
		length++;
	}
	if(i>length)
	printf("位置输入不合法");
	while (q){
		if(ii==i){
			printf("第%d个是%d",i,q->data);
		}
		q=q->next;
		ii++;
	}
	F();
}
/*给指定位置i插入元素e*/
void f7(linklist l,int i,int e){
	lnode *p=(lnode*)malloc(sizeof(lnode));
	p->data=e;
	for(int ii=1;ii<i;ii++)
	l=l->next;
	p->next=l->next;
	l->next=p;
}
/*删除指定位置的元素*/
void f8(linklist l,int i){
	lnode *p=(lnode*)malloc(sizeof(lnode));
	for(int ii=1;ii<i;ii++)
	l=l->next;
	p=l;
	l->next=l->next->next;	
}
int main(){
	linklist l;
	l=f1();
	int a;
	printf("请输入链表l的长度");
	scanf("%d",&a);
//	f2(l,a);
//	f3(l);
	f4(l,a);
	f3(l);
	//按值查找 
//	int e;
//	q=l->next;
//	scanf("%d",&e);
//	f5(l,e);
	//按位查找
//	int i;
//	printf("请输入要查找的位序");
//	scanf("%d",&i);
//	f6(l,i);
	//给指定位置i插入元素e
//	int i,e;
//	printf("请输入要插入的位序");
//	scanf("%d",&i);
//	printf("请输入要插入的数字");
//	scanf("%d",&e);
//	f7(l,i,e);
//	f3(l);
	//删除指定位置的元素
//	int i;
//	printf("请输入要删除的位序");
//	scanf("%d",&i);
//	f8(l,i);
//	f3(l);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值