按照自己的思路写的简单的链表,仅有创建、插入、删除操作,
写的函数尽量仿造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; }