为了复试开始复习C语言的一些编程技巧,今天复习C链表。
1.链表的结构体
typedef struct node{
int data;
struct node* next;
}Node;
2.创建一个有n的节点的链表
Node *LinkCreate(int n)
{
Node *head,*end,*s;
int i;
head = end= (Node*)malloc(sizeof(Node));//头结点没有data,只有next
for(i=1;i<n;i++)
{
s=(Node*)malloc(sizeof(Node));
s->data = rand()%20; //随机给链表的data赋值(20以内)
end->next = s; //连接!
end=end->next; //继续后移!
}
end->next = NULL; //最后一位需要NULL,遍历的时候while(p)就行
return head;
}
补充说明:
1.malloc函数是动态分配空间,会返回开辟空间的首地址(这样就可以通过返回的指针找到它),加(Node *)的目的是让计算机知道,如何去划分这个开辟的空间。
2.图示如下
3.遍历链表
void outlink(Node* head) //头指针传入
{
Node *p;
p=head->next;
printf("%d, ",p->data);
while(p) //开始遍历,因为链表最后一位的next是NULL,所以到那里结束
{
printf("%d, ",p->data); //data打印出来
p=p->next;
}
}
4.插入
void insert(Node *head, int n)
{
Node *p = head, *in;
int i = 0;
while (i < n && p)
{
p = p->next;
i++;
} //指针后移到指定位置(n位之后)
if (p)
{
in = (Node*)malloc(sizeof(Node));
puts("输入要插入的值");
scanf("%d", &in->data);
in->next = p->next;
p->next = in; //最关键的两步,看图就明白了,一定要先把p->next赋值给in->next,不然就找不到下一个节点的位置了.
}
else
{
puts("not found\n");
}
}
插入示意图如图
5.删除结点
void del(Node *head, int n)
{
Node *p = head, *in;
int i = 0;
while (i < n &&p)
{
in = p;
p = p->next;
i++;
}//同上
if (p)
{
in->next = p->next; //移交指针
free(p); //malloc分配相对应的free释放
}
else
{
puts("not found\n");
}
}
删除示意图如图
6.整个程序预览
#include<stdio.h>
#include<stdlib.h>
#define N 5
typedef struct node
{
int data;
struct node *next;
}Node;
/*******************创建链表***********************/
Node *CreateLink()
{
Node *head,*end,*s;
int num;
head=end=(Node*)malloc(sizeof(Node));
do{
printf("please input a number:");
scanf("%d",&num);
s=(Node*)malloc(sizeof(Node));
s->data = num;
end->next=s;
end=end->next;
}while(num!=0);
end->next = NULL;
return head;
}
/***************把指针反过来,从后期往前指****************/
void BackWard(Node* head)
{
Node *p,*s=NULL,*end;
p=head;
while(p->next)
{
p = p->next;
}
end=p; //end定位到最后
while(1)
{
p=head;
while(p->next)
{
s=p;
p = p->next;
}
p->next=s;
s->next=NULL;
if(s==head)
{
p->next = NULL;
head->next = end;
break; //头指针指向最后一个数据
}
}
//return head;
}
/*******************在第n个结点插入数据data,0表示最前面***********************/
void *InsertLink(Node* head,int n,int Data)
{
int i;
Node *p,*s;
p=head;
s=(Node*)malloc(sizeof(Node));
for(i=0;i<n&&p->next ;i++) //保证n大于链表长度的时候把数值插入到链表最后
{
p=p->next ;
}
s->data=Data;
s->next = p->next ;
p->next =s;
}
/*******************删除第n个结点,0是第一个结点,n过大则删除最后一个***********************/
void DelLink(Node* head,int n)
{
int i;
Node *p,*s;
p=head;
for(i=0;i<n&&p->next ;i++) //保证n大于链表长度的时候删除链表最后的值
{
p=p->next ;
}
s=p->next;
p->next = s->next;
free(s);
}
/*******************遍历打印***********************/
void OutLink(Node* head)
{
Node* p;
p=head->next; //第一个头指针的值无意义
while(p)
{
printf(" %d ",p->data);p=p->next;
}
printf("\n");
}
/*******************对链表之中的数据 进行排序***********************/
void OrderLink(Node* head) //对链表之中的数据 进行排序
{
int max,temp;
Node* p,*s;
s=p=head->next ;
while(s->next) //双指针来排序,总把最大的放前面
{
p=s;
while(p)
{
if(s->data < p->data)
{
temp = s->data ;
s->data = p->data ;
p->data = temp;
}
p = p->next;
}
s = s->next ;
}
}
/*****************插入一个数,按顺序放在一个顺序链表中***********************/
void InsertOrder(Node* head,int num)
{
Node* p,*s;
p=head->next ;
s=(Node*)malloc(sizeof(Node));
s->data =num;
while(p)
{
if(p->data >=num&&p->next ->data <=num)
{
s->next = p->next ;
p->next = s;
break;
}
p=p->next ;
}
}
int main()
{
Node* head;
head = CreateLink();
InsertLink(head,6,100); //在第六位插入100
DelLink(head,0); //删除第一个数字
OrderLink(head); //排序
InsertOrder(head,20); //插入一个数,顺序插入节点中
BackWard(head); //倒序
OutLink(head); //打印
}