链表学习篇

一.链表的初始化,建立,输出,插入,删除,查询

1.自定义结构体

//结构体实现自定义:
typedef struct Link{
	int elem;//数据域 
	struct Link *next;//指针域 
}link;

2.初始化链表

//初始化链表
link *initlink();
link *initlink() {
	link *p=(link *)malloc(sizeof(link));
	link *temp=p;//声明一个指针指向头

3.建立链表

//生成链表
	int i;
	for (i=1;i<5;i++) {
		link *a=(link *)malloc(sizeof(link));
		a->elem=i;
		a->next=NULL;
		temp->next=a;
		temp=temp->next;
	} 
	return p;
}

pass:如果想要自己给链表每一个节点的数据域输值,可以将代码改为

link *initlink();
link *initlink() {
	link *p=(link *)malloc(sizeof(link));
	link *temp=p;//声明一个指针指向头节点
	//生成链表
	int i;
	int n,elem;
	printf("请输入一个整数n\n");
	scanf("%d",&n);
	printf("请输入n个整数\n");
	for (i=0;i<n;i++) {
		link *a=(link *)malloc(sizeof(link));
		scanf("%d",&elem);
		a->elem=elem;
		a->next=NULL;
		temp->next=a;
		temp=temp->next;
	} 
	return p;
}

4.输出链表节点的值

//输出链表的元素数据域 
void display(link *p);
void display(link *p) {
	link *temp=p;
	//当temp不为NULL时,执行下列语句 pass,此时没有头结点
	while (temp) {
		printf("%d ",temp->elem);
		temp=temp->next;
	} 

5.链表插入
(1)尾插法

#include<stdio.h>
#include<stdlib.h>
#define N 3

typedef struct node{
	char name[20];
	struct node *next;
}stdu;
stdu *creat(int n);
stdu *creat(int n) {
	stdu *p,*h,*s;
	int i;
	if ((h=(stdu*)malloc(sizeof(stdu)))==NULL) {
		printf("不能分配内存空间\n");
		exit(0);
	}
	h->name[0]='\0';
	h->next=NULL;
	p=h;
	for (i=0;i<n;i++) {
		if ((s=(stdu*)malloc(sizeof(stdu)))==NULL) {
		printf("不能分配内存空间\n");
		exit(0);
	}
	p->next=s;
	printf("请输入第%d个人的姓名\n",i+1);
	scanf("%s",&s->name);
	s->next=NULL;
	p=s;

	}
	return (h);
	
}
int main() {
	int number;
	stdu *head,*t;
	number=N;
	head=creat(number);
	t=head;
	if (head!=NULL) {
		while(t->next!=NULL) {
			t=t->next;
			printf("%s ",t->name);
		}
	}
	
}

(2).头插法

#include<stdio.h>
#include<stdlib.h>
#define N 3

typedef struct node{
	char name[20];
	struct node *next;
}stdu;
stdu *creat(int n);
stdu *creat(int n) {
	stdu *p,*h,*s;
	int i;
	if ((h=(stdu*)malloc(sizeof(stdu)))==NULL) {
		printf("不能分配内存空间\n");
		exit(0);
	}
	h->name[0]='\0';
	h->next=NULL;
	p=h;
	for (i=0;i<n;i++) {
		if ((s=(stdu*)malloc(sizeof(stdu)))==NULL) {
		printf("不能分配内存空间\n");
		exit(0);
	}
       // s->next=p->next;
	printf("请输入第%d个人的姓名\n",i+1);
	scanf("%s",&s->name);
	s->next=p->next;
	p->next=s;
	p=h;
	//free(s);
	}
	return (h);

(3).任意位置插入

//插入函数 
link *insertelem(link *p,int elem,int add);
link *insertelem(link *p,int elem,int add) {
	link *temp=p;
	//首先找到要插入位置的上一个节点
	int i; 
	for (i=1;i<add;i++) {
		temp=temp->next;
	}
	//printf("%d  ",temp->elem);
	//创建插入节点
	link *c=(link *)malloc(sizeof(link));
	c->elem=elem;
	//向链表中插入节点
	c->next=temp->next;
	temp->next=c;
	return p; 
}

6.链表删除
(1).删除链表中指定位置的元素

link *delelem(link *p,int elem);
link *delelem(link *p,int elem) {
	link *temp=p;
	link *pre=NULL;
	while (temp->next!=NULL) {
		pre=temp;
		temp=temp->next;//找到要删除的节点 
		if (temp->elem==elem) {
			pre->next=temp->next;//将要删除的节点的上一个节点的指针指向要删除节点的下一个节点 
		
		}
			
	}
	return p;

}

(2).删除重复次数的元素

删除链表中重复的元素,只保留一个元素 
link *del(link *p);//这是一个无头结点的链表 
link *del(link *p) {//删除思想,让temp1遍历每一个节点,temp2在temp1遍历一个节点时,遍历temp1后的全部节点,寻找与temp1遍历节点相同的值的节点,删除 
	link *temp1=p;
	link *temp2=p;
	link *pre=NULL;
	temp1=temp1->next;
	while (temp1!=NULL) {
		temp2=temp1->next;
		pre=temp1;
		while (temp2!=NULL) {
			
			if (temp2->elem==temp1->elem) {
				pre->next=temp2->next;
			}
			pre=temp2;
			temp2=temp2->next;
		}
	   temp2=p;
	   pre=NULL;
	   temp1=temp1->next;	
	}
	return p;
}

7.链表查询
(1)查询链表元素出现的次数

//查询链表元素出现的次数
link *search(link *p);
link *search(link *p) {
	link *temp1=p;//让temp1与temp2指向头指针 
	link *temp2=p;
	int count=0;
// 遍历链表,让emp1先指向链表的第一个节点,然后让 temp2遍历链表寻找与 temp1->elem相等的节点 
	while (temp1!=NULL) {
		int count=0;
		temp1=temp1->next;
		while (temp2!=NULL) {
	           if (temp2->elem==temp1->elem) {
	           	  count++;//找到相等节点时,次数+1 
			   }
			   temp2=temp2->next;
		}
		printf("%d出现%d次\n",temp1->elem,count);//temp1每指向一个节点,输出次数 
		temp2=p;//temp2每遍历一次,让temp2重新指向头指针 
	    count=0;//重新纪录次数,调次数为0 
	}
	return p;
}

在这里插入图片描述
3.从小到大排序数据

#include <stdio.h>
#include <stdlib.h>
struct Node
{
	int value;
	struct Node *next;
};
void insertNode(struct Node **head,int value) {
	struct Node *previous;
    struct Node *current;
    struct Node *new;
    current=*head;
    previous=NULL;
    while (current!=NULL&&current->value<value) {
    	previous=current;
    	current=current->next;
	}
	new=(struct Node *)malloc(sizeof(struct Node));
	if (new==NULL) {
		printf("内存分配失败\n");
		exit(1);
	}
	new->value=value;
	new->next=current;
	if(previous==NULL) {
		*head=new;
	}
	else
	    {
	    	previous->next=new;
		}
}
void printNode(struct Node *head) {
	struct Node *current;
	current=head;
	while (current!=NULL) {
		printf("%d ",current->value);
		current=current->next;
	}
}
int main(void) {
	struct Node *head=NULL;
	int input;
	while (1) {
		printf("请输入一个整数(输入-1表示结束)\n");
		scanf("%d",&input);
		if (input==-1) {
			break;
		}
		insertNode(&head,input);
		printNode(head);
		 
	}
	return 0;
}
void fun(NODE *h)
{
	NODE *p, *q;
	int t;
	p = h;
	while(p)
	{
		q = p->next;
		while (q != NULL)
		{
			if (p->data > q->data)
			{
				t = p->data;
				p->data = q->data;
				q->data = t;
			}
			q = q->next;
		}
		p = p->next;
 
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值