1.单链表的定义
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
2.单链表的结构
data域:存放结点值的数据域
next域:存放结点的直接后继的地址(位置)的指针域(链域)
链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的,每个结点只有一个链域的链表称为单链表
头结点:单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。链表由头指针唯一确定,单链表可以用头指针的名字来命名。
终端结点:结点无后继,故终端结点的指针域为空,即NULL。
typedef struct node{
int data;
struct node *next;
}list;
3.链表的创建
void creatlist(list *head)
{
int n,i;
list *p,*q;
printf("输入数字个数:");
scanf("%d",&n);
printf("输入数字:");
p=head;
head->next=NULL;
for(i=0;i<n;i++)
{
q=(list*)malloc(sizeof(list));
scanf("%d",&q->data);
p->next=q;
q->next=NULL;
p=q;
}
getchar();
}
注意:创建时候要考虑题目中有没有说要带头结点,如果要带头结点,head结点中就不能存放数据;如果不带头结点,head结点就要放数据。(上述代码是不带头结点的链表)
4.链表的遍历
void Print(list *head)
{
list *p;
p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
5.链表删除相同元素
void Delete(list *head){
list *p,*q,*t;
p=head->next;
int k;
while(p->next!=NULL){
t=p;
q=t->next;
k=0;
if(p->data==q->data)
{
q=q->next; //如果相同,则q往后移
t->next=q; //让t的下一个变成往后移的q,就断开了了之前q的结点
if(p->next==NULL)
break;
k=1;
}
if(p->next==NULL)
break;
else
{
if(k==0)
p=p->next;
}
}
}
6.判断链表是否有序
void jugde(list *head){
list *p,*q;
p=head->next;
while(p!=NULL){
q=p->next;
while(q!=NULL){
if(p->data<q->data){
printf("格式错误!");
getchar();
exit(0);}
else
q=q->next;
}
p=p->next;
}
}
7.链表逆置
void Inversion(list *head){
list *p,*q;
p=head->next;
head->next=NULL;
while(p!=NULL){
q=p;
p=p->next;
q->next=head->next;
head->next=q;
}
}
以下是第一步的逆置过程
读者可以接着这个循环一直遍历下去,就能知道整个逆置过程了
8.完整代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}list;
void creatlist(list *head)
{
int n,i;
list *p,*q;
printf("输入数字个数:");
scanf("%d",&n);
printf("输入数字:");
p=head;
head->next=NULL;
for(i=0;i<n;i++)
{
q=(list*)malloc(sizeof(list));
scanf("%d",&q->data);
p->next=q;
q->next=NULL;
p=q;
}
getchar();
}
void Print(list *head)
{
list *p;
p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void Delete(list *head){
list *p,*q,*t;
p=head->next;
int k;
while(p->next!=NULL){
t=p;
q=t->next;
k=0;
if(p->data==q->data)
{
q=q->next;
t->next=q;
if(p->next==NULL)
break;
k=1;
}
if(p->next==NULL)
break;
else
{
if(k==0)
p=p->next;
}
}
}
void jugde(list *head){
list *p,*q;
p=head->next;
while(p!=NULL){
q=p->next;
while(q!=NULL){
if(p->data<q->data){
printf("格式错误!");
getchar();
exit(0);}
else
q=q->next;
}
p=p->next;
}
}
void Inversion(list *head){
list *p,*q;
p=head->next;
head->next=NULL;
while(p!=NULL){
q=p;
p=p->next;
q->next=head->next;
head->next=q;
}
}
int main(){
list head;
creatlist(&head);
jugde(&head);
Delete(&head);
Inversion(&head);
printf("结果:");
Print(&head);
getchar();
return 0;
}