数据结构C语言版--单链表的基本功能实现

/* * 构造一个链式存储的线性表(当输入9999时,结束构造过程),然后输出该线性表 * 并统计该线性链表的长度 。 *注:new和delete是C++的运算符 malloc和free是C++/C的标准库函数 */ #include<stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 //单链表的存储结构 struct LinkNode{ int data; //节点的数据域 struct LinkNode *next; //节点的指针域 }; //1.打印输出,链表的数据,其中链表指向头节点 void print(LinkNode *L){ LinkNode *p; //定义一个指针变量p p = L->next; //使p指向链表L的第一个数据 while(p != 0){ printf("%d、",p->data); p = p->next; //指针后移 } printf(" "); //换行 } //2.链表长度 int Length_LinkList(LinkNode *L){ LinkNode *p; //定义一个指针变量 int len = 0; // 定义一个计数器,计算节点个数 p = L->next; //指针P指向链表的第一个节点 while(p != NULL){ len++ ; p = p->next; //指针后移,即指向当前节点的后继节点 } return len; //返回链表长度 } //3.按位置查找,单链表中寻找第i个元素,返回指向第i个节点的指针 LinkNode* FindI_LinkNode(LinkNode *L,int i){ LinkNode *p; //定义指针变量 int j = 1; //定义计数器 p = L->next; //让p指向头节点 while(j < i){ //当没有找到第i个节点 p = p->next; //指针后移 j++; //计数器加一 } return p; } //4.按值查找,单链表中寻找元素e,返回元素e所在的位置 int FindE_LinkNode(LinkNode* L,int e){ LinkNode *p; int count=0; p=L->next; while(p != NULL) { count++; if(p->data==e) return (count); p=p->next; } return 0; } //5.在表头插入数据 int Insert_head(LinkNode* &L,int x){ //在以H为头节点的单链表中在头节点后插入数据 LinkNode *t; //定义指针 t = new LinkNode; //申请空间 t->data = x; //向新节点中写入数据 t->next = L->next; //把链表的第一个节点的地址写入到新节点中,也就是新节点的指针域置为null L->next = t; //让头节点的next指针指向新节点 ,把新节点接到链表上 return OK; } //6.在表尾插入数据 int Insert_end(LinkNode *L,int x){ LinkNode *t; t = new LinkNode; //申请空间 t->data = x; //把数据赋到新节点的数据域 while(L->next != NULL){//当链表不为空时,指针向后移动,因为数据要插入最后一个位置 L = L->next; //指针向后移动 } //直到指针移到最后一个 L->next = t; //将链表末尾节点的下一节点指向新节点 t->next = NULL; //新节点的指针域置空 return OK; } //7.在第i个位置插入数据 int Insert_LinkNode(LinkNode *L,int i,int x){ if(i < 1 || i > Length_LinkList(L)){ printf("插入位置错误! "); return ERROR; } LinkNode *p; if(i == 1) p = L; //指针P指向头节点 else p = FindI_LinkNode(L,i-1); //让P指向第i-1个节点 Insert_head(p,x); //将x插入假设以p节点为头节点的链表中 return OK; } //8.删除首元节点 int Del_Head(LinkNode *L){ if(L->next != NULL){ LinkNode *p; //定义一个指针变量 p = L->next; //指针p指向第一个节点,p->next指向下一个节点 L->next = p->next; //头节点的指针域存储第二个节点的地址 delete p; //删除第一个节点,释放空间 }else{ printf("空表! "); return FALSE; } } //9.删除表尾节点 int Del_End(LinkNode *L){ if(L->next != NULL){ LinkNode *p; LinkNode *q; int i; p = L->next; //指针p指向第一个节点 for(i = 1;i < Length_LinkList(L) - 1;i++){ p = p->next; } q = p->next; p->next = NULL; //free(q); delete q; }else{ printf("空表!"); } } //10.删除指定位置上的元素 int Del_i(LinkNode* L,int i){ if(i<1 || i>Length_LinkList(L))//如果删除位置不合法 { printf("删除位置不合法!"); return 0; } LinkNode *p; if(i==1) p=L; //让p指向头结点 else p=FindI_LinkNode(L,i-1); //让p指向第i-1个结点 Del_Head(p); //删除以p为头结点的链表的第一个数据结点 return OK; } /* * 在主函数中传递参数,传参分为值传递和址传递, */ int main(){ int i,x,count,m; LinkNode *H; //定义链表指针 LinkNode *add; H = new LinkNode; //申请空间 //H->data = -1; //为成员变量数据赋值 H->next = NULL; //为成员变量指针赋值 printf("输入数据: "); while(1){ scanf("%d",&i); if(i == 9999){ break; }else{ Insert_end(H,i); //插入数据 } } printf("The LinkNode elem is:"); print(H); //输出数据 printf("1.请输入从表头插入的数据:"); scanf("%d",&i); Insert_head(H,i); printf("The LinkNode elem is:"); print(H); printf("2.请输入从表尾插入的数据:"); scanf("%d",&i); Insert_end(H,i); printf("The LinkNode elem is:"); print(H); printf("3.请输入要插入的位置、数据(空格隔开): ");//判断输出的插入位置是否合法 scanf("%d %d",&i,&x); Insert_LinkNode(H,i,x); printf("The LinkNode elem is:"); print(H); printf("4.请输入要查询的位置:"); scanf("%d",&i); if(i < 1 || i > Length_LinkList(H)){ //若查询位置不合法,返回error printf("查询位置不合法! "); }else{ add = FindI_LinkNode(H,i); int e = add->data; printf("位置:%d的数据是:%d ",i,e); } printf("4.请输入要查询的元素: "); scanf("%d",&i); m = FindE_LinkNode(H,i); if(m == 0){ printf("查无此元素! "); }else{ printf("数据:%d所在的位置是:%d ",i,m); } Del_Head(H); printf("5.删除首元节点后: The LinkNode elem is:"); print(H); Del_End(H); printf("6.删除表尾节点后: The LinkNode elem is:"); print(H); printf("7.指定删除节点的位置: "); scanf("%d",&i); if(i < 1 || i > Length_LinkList(H)){ //若查询位置不合法,返回error printf("指定位置不合法! "); }else{ Del_i(H,i); printf("6.删除指定节点后: The LinkNode elem is:"); print(H); } count = Length_LinkList(H); printf("8.此链表长度为:%d ",count); return 0; }