



#include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define IINFEASIBLE -1 #define OVERFLOW -2 #define LIST_INIT_SIZE 10 #define LISTINCREAMENT 2 typedef int ElemType; typedef int Status; typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList;
//逆序建立单链表
void CreateList_L(LinkList &L,int n){ //逆位序输入n个元素的值,建立带头结点的单链表L int i; LinkList p; L=(LinkList)malloc(sizeof(LNode)); L->next = NULL;//先建立一个带头结点的单链表 for(i = n;i>0;--i){ p = (LinkList)malloc(sizeof(LNode)); //生成新结点 scanf("%d",&p->data); //插入元素值 p->next = L->next; L->next = p;//插入到表头 }//CreateList_L }
//打印单链表
void PrintList_L(LinkList L){ //打印输出链表元素的值 LinkList p=L->next; while(p) { printf("%d ",p->data); p = p->next; } printf("\n"); }//PrintList_L
//取第I个元素
Status GetElem_L(LinkList L,int i,ElemType &e){ //L为带头结点的单链表的头指针 //当第i个元素存在时,其赋值给e并返回OK,否则返回ERROR LinkList p; p=L->next; int j=1; //初始化,p指向第一个结点,j为计数器 while(p&&j<i){ //顺时针向后查找,直到P指向第i个元素或p为空 p=p->next; ++j; } if(!p||j>i) return ERROR; //第i个元素不存在 e=p->data; //取第i个元素 return OK; }//GetElem_L
//插入元素
Status LinkInsert_L(LinkList &L,int i,ElemType e){ //在带头结点的单链线性表L中第i个位置之前插入元素e LinkList p; LinkList s; p=L; int j=0; while(p&&j<i-1){ //寻找第i-1个结点 p=p->next; ++j; } if(!p||j>i-1)//i小于1或者大于表长加1 return ERROR; s=(LinkList)malloc(sizeof(LNode)); //生成新结点 s->data=e; s->next=p->next; //插入L中 p->next=s; return OK; }//LinkInsert_L
//删除元素
Status LinkDelete_L(LinkList &L,int i,ElemType &e){ //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 LinkList p; LinkList q; p=L; int j=0; while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱 p=p->next; ++j; } if(!(p->next)||j>i-1) return ERROR; //删除位置不合理 q=p->next; p->next=q->next; //删除并释放结点 e=q->data; free(q); }//LinkDelete_L
//主函数
int main() { struct LNode; ElemType e; LinkList L; int i,n,t,a,b; printf("请输入链表中最开始的数据个数\n"); scanf("%d",&n); printf("请输入链表中最开始的数据\n"); CreateList_L(L,n); PrintList_L(L); printf("请输入需要插入元素的位置:"); scanf("%d",&i); printf("请输入需要插入元素的的值:"); scanf("%d",&e); t=LinkInsert_L(L,i,e); if(t==OK) { printf("插入成功!"); printf("插入成功后的链表中元素为:\n"); PrintList_L(L); } else { printf("插入失败!"); } printf("请输入需要得到指定元素的位置:\n"); scanf("%d",&i); a=GetElem_L(L, i,e); if(a==OK) { printf("得到成功!"); printf("得到成功后的元素为%d\n",e); } else { printf("得到失败!"); } printf("请输入需要删除元素的位置:\n"); scanf("%d",&i); b=LinkDelete_L(L,i,e); if(b==OK) { printf("删除成功!"); printf("删除的元素为%d\n",e); printf("删除成功后的链表元素为:\n"); PrintList_L(L); } else { printf("删除失败!\n"); } return 0; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230595.html原文链接:https://javaforall.net
