数据结构链表 取结点数据值出了点小问题
程序代码:
/*链表: 建立单链表,顺序输入5个数,然后在第3个结点前面插入一个结点,接着 删除第3个结点,并显示表中所有结点数据值,给定1-5中的任意整数i,给出链表 中第i个结点的数据值。*/ #include<stdio.h> #include<stdlib.h> #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int ElemType; typedef int Status; //链表的类型定义 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; //链表的初始化函数定义 Status InitList(LinkList &L) { L=(LinkList)malloc(sizeof(LNode)); if(!L)exit(OVERFLOW); L->next=NULL; return OK; } //链表的建立函数定义 void CreateList(LinkList &L,int n) { //逆序输入n个元素的值,建立带表头结点的线性链表 int i; LinkList p; L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; //建立头结点 printf("输入数据: "); for(i=n;i>0;--i) { p=(LinkList)malloc(sizeof(LNode)); //生成新结点 scanf("%d",&p->data); p->next=L->next; L->next=p; //插入到表头 } } //链表的插入函数定义 Status ListInsert(LinkList &L,int i,ElemType e) { //在带头结点的线性链表L中第i元素结点之前插入元素e LinkList p,s; int j=0; p=L; while(p&&j<i-1) //寻找第i个元素前面一个结点 { p=p->next; //p指向第1个元素结点时,j=1....p指向第i-1个元素结点时,j=i-1,不再执行 ++j; //j用于计数 } if(!p||j>i-1) //i小于1或者大于表长 return ERROR; s=(LinkList)malloc(sizeof(LNode)); //分配新结点 s->data=e; s->next=p->next; p->next=s; //在第i-1个结点和第i个结点之间插入 return OK; } //链表的删除函数定义 Status ListDelete(LinkList &L,int i,ElemType &e) { //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 LinkList p,q; int j=0; p=L; 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;//p指向第i-1个元素,q指向第i个元素,然后将第i个和第i+1个元素连接 e=q->data; free(q); return OK; } //给定i值,获得链表中对应结点数据值的函数定义 Status GetElem(LinkList L,int i,ElemType &e) { LinkList p; int j; p=L->next; j=1; while(p&&j<i) { p=p->next; ++j; } if(!p&&j>i) return ERROR; e=p->data; return OK; } //链表的销毁函数定义 Status Destroy(LinkList &L) { LinkList p; while(L=!NULL) { p=L->next; free(L); //从开头开始释放空间 L=p; } } //链表各结点数据值打印输出函数定义 void print(LinkList &L) { LinkList p; p=L->next; if(L!=NULL) { printf("打印输出: "); do{ printf("%d ",p->data); p=p->next; }while(p!=NULL); } } void main() { //变量定义 LinkList L; ElemType e; int i; //链表初始化函数调用 InitList(L); //链表建立函数调用 CreateList(L,5); //链表各结点数据值打印输出函数调用 print(L); //链表的插入函数调用,实现在第3个结点前面插入一个结点,结点数据值通过键盘输入 printf("\n在第3个结点前面插入一个结点:"); scanf("%d",&e); ListInsert(L,3,e); //链表各结点数据值打印输出函数调用 print(L); //链表的删除函数调用,实现删除第3个结点,删除的结点数据值复制给变量e printf("\n删除第三个结点,"); ListDelete(L,3,e); //链表各结点数据值打印输出函数调用 print(L); //给定i值,获得链表中对应结点数据值的函数调用 printf("\n取第i个结点的数据值: "); scanf("%d",&i); GetElem(L,i,e); printf("Data值为: %d\n",e); //链表的销毁函数调用 Destroy(L); }