一.链表的初始化,建立,输出,插入,删除,查询
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&¤t->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;
}
}