代码:
//这个程序是带头结点的单链表的实现
/*
单链表链式存储结构
头指针与头结点的异同:
头指针:
1、头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针
2、无论链表是否为空,头指针均不为空
3、头指针是链表的必要元素
头结点:
1、头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度)
2、头结点不一定是链表的必要元素
*/
#include<stdio.h>
#include <stdlib.h>
typedef int bool;
#define true 1
#define false 0
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
/*
头插法建立单链表
头插法从一个空表开始,生成新结点,读取数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止
始终让新结点插在第一的位置
*/
//L是指向LinkList(即Node*)的指针类型,*L和LinkList类型一样
void createListHead(LinkList *L){
LNode *s;
int x;
*L=(LinkList)malloc(sizeof(LNode)); //创建头结点
(*L)->next=NULL;
scanf("%d",&x);
while(x!=9999){
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=(*L)->next;
(*L)->next=s;
scanf("%d",&x);
}
return L;
}
bool isEmpty(LinkList L){
if(L->next=NULL){
return true;
}
else{
return false;
}
}
bool listInsert(LinkList *L,int i,int e){
if(i<1){
return false;
}
LNode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p=*L; //L指向头结点,头结点是第0个结点(不存数据)
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
LNode *s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
bool listDelete(LinkList *L,int i,int *e){
if(i<1){
return false;
}
LNode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p=*L; //L指向头结点,头结点是第0个结点(不存数据)
while(p!=NULL&&j<i-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
//第i-1个结点之后已无其他结点
if(p->next==NULL){
return false;
}
LNode *q=p->next; //q指向被删除结点
*e=q->data;
p->next=q->next;
free(q);
return true;
}
LNode* getElem(LinkList L,int i){
int j=1;
LNode *p=L->next;
if(i==0){
return L;
}
if(i<1){
return NULL;
}
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
int clearList(LinkList *L){
LinkList p,q;
p=(*L)->next;
while(p){
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
return 0;
}
void outputList(LinkList L){
if(L->next==NULL){
printf("此链表为空\n");
}
LinkList temp=L;
while(temp->next!=NULL){
temp=temp->next;
printf("%d ",temp->data);
}
printf("\n");
}
int main(){
LinkList L;
int e;
createListHead(&L);
outputList(L);
listInsert(&L,2,9);
outputList(L);
listDelete(&L,3,&e);
outputList(L);
clearList(&L);
return 0;
}
运行结果: