按照自己的思路写的简单的链表,仅有创建、插入、删除操作,
写的函数尽量仿造ADT上的基本操作,虽仍有些不同,应更易理解
一个带头结点的线性链表类型定义如下:
Status InitList(LinkList &L);
//构造一个空的线性链表
Status ListEmpty(LinkList L);
//若线性链表L为空表,则返回TRUE,否则返回FALSE
Status ListInsert(LinkList L, int i, ElemType e);
//在带头节点的单链线性表L的第i个元素之前插入元素e
Status ListDelete(LinkList L, int i, ElemType &e);
//删除带头节点的单链线性表L的第i个节点,并以e表示
/*
目的:创建一个链表CreateList();
作用:可完成ListInsert(插入)、ListDelete(删除)、判断是否为空ListEmpty操作
*/ ----《郝斌数据结构自学视频》、《数据结构C语言版》(严蔚敏)
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node{
int date;
struct Node *next;
}NODE, *PNODE;
int len;
/*****************创建链表***************/
PNODE CreateList(void){
int i,val; //val用来临时存放有效节点
printf("请输入节点的个数: ");
scanf("%d",&len); //输入要生成的链表的节点个数
PNODE pHead = (PNODE)malloc(sizeof(NODE)); //生成头节点
if(NULL==pHead){
printf("分配失败,程序终止!\n");
exit(-1);
}
PNODE pTail = pHead;
pTail->next = NULL;
for(i=0; i<len; ++i){
printf("输入第%d个节点: ",i+1);
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL==pNew){
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew->date = val;
pTail->next = pNew;
pNew->next = NULL;
pTail = pNew;
}
return pHead; //返回头指针
}
/********判断是否为空*********/
bool ListEmpty(PNODE pHead){
if(pHead->next==NULL)
return 1;
else
return 0;
}
/*****************插入***************/
PNODE ListInsert(PNODE pHead, int pos, int e){
if(pos>len+1||pos<1){
printf("节点不存在,程序终止!\n");
exit(-1);
}
PNODE p = pHead;
int t=0;
while(t<pos-1){ //p在除去头结点后的pos-1个节点
p = p->next;
t++;
}
PNODE q = (PNODE)malloc(sizeof(PNODE));
q->date = e;
q->next = p->next;
p->next = q;
}
/****************删除**************/
int ListDelete(PNODE pHead, int pos, int *e){
if(pos>len||pos<1){
printf("节点不存在,程序终止!\n");
exit(-1);
}
PNODE p = pHead;
int t=0;
while(t<pos-1){
p = p->next;
t++;
}
PNODE q = p->next;
*e = q->date;
p->next = q->next;
free(q);
return 1;
}
/************遍历*************/
void ListTraverse(PNODE pHead){
PNODE p = pHead->next;
while(NULL!=p){
printf("%d ",p->date); //p从头指到尾
p = p->next;
}
printf("\n");
}
int main(void){
int e;
PNODE pHead=NULL;
pHead=CreateList();//创建链表
ListInsert(pHead,6,99); //将99插入到第6个位置
/* if( ListDelete(pHead,6,&e) ){//将第6个元素删除,同时显示删除的元素
printf("%d\n",e);
}*/
ListTraverse(pHead);//遍历
return 0;
}