一:头插法(就是你输入元素往前面插,所以你插入元素完后,你输入的最后一个数其实是在表的第一位)
(创建表其实就是元素的插入,就是多了几个步骤)
typedef struct Node{
ElemType data;//数据域
struct Node *next;//指针域
}Node;
typedef struct Node *LinkList;
/*n个元素,在主函数也要先建立一个空的单链表L*/
void createlisthead(LinkList *L,int n)//头插法创表
{
LinkList p;声明指针p
int i;//计数器
*L=(LinkList)malloc(sizeof(Node));//为L开辟内存空间
(*L)->next=NULL;//建立带头结点的表
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
p->next=(*L)->next;//生成新结点赋值给p
(*L)->next=p;//p插入到前一结点前面
}
}
二:尾插法(正常思维,插入到后面,输入顺序与输出顺序相同)
void createlisttail(LinkList *L,int n)
{
LinkList p,r;//r是指向链表的变量
int i;
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++)
{
p=(Node *)malloc(sizeof(Node));
scanf("%d",&p->data);
r->next=p;//起到一个连线的作用
r=p;//r始终指向最后一个结点(元素)
}
r->next=NULL;
}
三:单链表的具体操作(只写了一个删除,但是其他操作也都类似)
#include "stdio.h"
#include "stdlib.h"
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType data;//数据域
struct Node *next;//指针域
}Node;
typedef struct Node *LinkList;
void creatlisthead(LinkList *L,int n)//整表创建头插法
{
LinkList p;//声明指针p
int i;
*L=(LinkList)malloc(sizeof(Node));//为空链表L开辟内存空间
(*L)->next=NULL;//头结点指向空
for(i=0;i<n;i++){//输入链表里的数据
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&p->data);
p->next=(*L)->next;
(*L)->next=p;
}
}
Status ListDelete(LinkList *L,int i,ElemType *e)//删除,具体删除的解释在前章博客也有解释
{
int j;
LinkList p,q;
p=*L;
j=1;
while(p->next&&j<i){
p=p->next;
++j;
}
if(!(p->next)||j>i)
return ERROR;
q=p->next;
p->next=q->next;
*e=q->next;
free(q);
return OK;
}
int main()
{
LinkList *L;//建立一个空链表来准备传递给creatlisthead函数创建整表
ElemType *e;// 声明一个e元素来靠它返回值
LinkList t;//声明一个t指针来后面指向删除元素后的链表
int a[5]={0};//建立数组,创建表是用头插法,越后面输入的元素在表中越前面,输出就会相反,所以要利用数组来将它逆序输出
int i=0;//定义i作为数组下标
int h,m,p; //m是数组输出的下标,p是判断删除是否执行了
creatlisthead(&L,5);
printf("delet\n");
scanf("%d",&h);
p=ListDelete(&L,h,&e);
if(p==OK){
t=*L;//让t指向删除元素后的链表头结点
while(t){//一个一个往后推出元素
a[i++]=t->data;
t=t->next;
}
for(m=i-1;m>=0;m--)//因为上面的推出元素与输入是相反,所以靠数组将它逆序输出
printf("%d",a[m]);
}
return 0;
}
四:单链表学完的体会
在实际操作的时候要注意main函数里的操作,特别是传L的地址要用&L,然后就是操作完后的输出链表里元素的操作。。先声明一个指针t,比如删除操作结束后,让t指向链表L,再while(t),t=t->next操作、。。这些都是要注意的