结构体定义
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,LinkList;
声明结构体变量
LinkList LA, LB, LC, LD, LE;
运行到断点处,检查每个结构体变量的成员
第二个变量 LB 的成员与其他几个都不同,而且不仅有头结点,还有头结点后的一个结点
更改顺序
同样是第二个变量异常
奇怪
完整代码
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,LinkList;
Status InitList(LinkList *L); //初始化单链表
Status ClearList(LinkList *L); //清空单链表
int Listlength(LinkList L); //求单链表的长度
Status GetElem(LinkList L, int i, ElemType *e); //返回第i个结点的值
LNode *LocateList(LinkList L, ElemType e); //返回第一个数据与e相等的结点的指针
Status ListInsert(LinkList *L, int i, ElemType e); //在第i个结点前插入数据e
Status ListDelete(LinkList *L, int i, ElemType *e); //删除第i个数据结点
Status ListTraverse(LinkList L); //输出单链表中的数据
Status Union(LinkList *La, LinkList Lb); //集合并
Status Intersection(LinkList *La, LinkList Lb); //集合交
Status Difference(LinkList *La, LinkList Lb); //集合差
Status MergeList(LinkList La, LinkList Lb, LinkList *Lc); //有序表合并
Status Purge(LinkList *Lc); //去除重复元素
Status Restore(LinkList *L, int a[], int t); //生成,还原数据
int main()
{
int a[] = {2, 8, 27, 39, 66, 77, 89};
int b[] = {6, 18, 27, 59, 65, 77, 89, 120, 140};
LinkList LA, NO, LB, LC;
InitList(&LA);
InitList(&LB);
Restore(&LA, a, 7);
Restore(&LB, b, 9);
ListTraverse(LA);
ListTraverse(LB);
system("pause");
}
Status InitList(LinkList *L)
{
L = (LinkList *)malloc(sizeof(LinkList));
L->next = NULL;
return OK;
}
Status ClearList(LinkList *L)
{
LNode *p, *pn;
p = pn = L->next ;
L->next = NULL;
while(p->next != NULL)
{
p = p->next;
free(pn);
pn = p;
}
free(p);
return OK;
}
int Listlength(LinkList L)
{
int t = 0;
LNode *p;
p = &L;
while(p->next != NULL)
{
t++;
p = p->next;
}
return t;
}
Status GetElem(LinkList L, int i, ElemType *e)
{
LNode *p;
p = &L;
for(int j = 0; j < i; j++)
p = p->next;
*e = p->data;
return OK;
}
LNode *LocateList(LinkList L, ElemType e)
{
LNode *p;
p = L.next;
while (p->data != e)
p = p->next;
return p;
}
Status ListInsert(LinkList *L, int i, ElemType e)
{
LNode *p, *pn;
p = L->next;
pn = L;
if(Listlength(*L) == 0)
{
LNode *pe = (LNode *)malloc(sizeof(LNode));
pe->data = e;
L->next = pe;
pe->next = NULL;
}
else if(Listlength(*L) != 0)
{
for(int j = 1; j < i; j++)
{
p = p->next;
pn = pn->next;
}
LNode *pe = (LNode *)malloc(sizeof(LNode));
pe->data = e;
pn->next = pe;
pe->next = p;
}
return OK;
}
Status ListDelete(LinkList *L, int i, ElemType *e)
{
LNode *p, *pn;
pn = L;
p = L->next;
for(int j = 1; j < i; j++)
{
p = p->next;
pn = pn->next;
}
*e = p->data;
pn->next = p->next;
return OK;
}
Status ListTraverse(LinkList L)
{
LNode *p;
p = L.next;
if(L.next == NULL)
{
printf("表为空");
return OK;
}
while(p->next != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("%d", p->data);
printf("\n");
return OK;
}
Status Union(LinkList *La, LinkList Lb)
{
LNode *p;
p = La;
while(p->next != NULL)
{
p = p->next;
}
p->next = &Lb;
return OK;
}
Status Intersection(LinkList *La, LinkList Lb)
{
LNode *pa, *pb;
pa = La->next;
pb = Lb.next;
for(int i = 0; i < Listlength(*La); i++)
{
for(int j = 0; j < Listlength(Lb); j++)
{
if((pa->data != pb->data)&&(j == Listlength(Lb)))
ListDelete(La, i + 1, NULL);
else if(pa->data == pb->data)
break;
}
pa = pa->next;
}
return OK;
}
Status Difference(LinkList *La, LinkList Lb)
{
LNode *pa, *pb;
pa = La->next;
pb = Lb.next;
for(int i = 0; i < Listlength(*La); i++)
{
for(int j = 0; j < Listlength(Lb); j++)
{
if(pa->data == pb->data)
{
ListDelete(La, i + 1, NULL);
pb = pb->next;
break;
}
pb = pb->next;
}
pa = pa->next;
}
return OK;
}
Status MergeList(LinkList La, LinkList Lb, LinkList *Lc)
{
LNode *pa, *pb;
int i = 0;
pa = La.next;
pb = Lb.next;
while ((pa != NULL)||(pb != NULL))
{
if((pa == NULL)&&(pb != NULL))
{
pa = pb;
break;
}
if(pa->data <= pb->data)
{
ListInsert(Lc, i, pa->data);
pa = pa->next;
i++;
continue;
}
else
{
ListInsert(Lc, i, pb->data);
pb = pb->next;
i++;
continue;
}
}
return OK;
}
Status Purge(LinkList *Lc)
{
LNode *p, *pn;
int i = 1;
p = Lc->next->next;
pn = Lc->next;
while(p != NULL)
{
if(pn->data == p->data)
ListDelete(Lc, i, NULL);
p = p->next;
pn = pn->next;
}
return OK;
}
Status Restore(LinkList *L, int a[], int t)
{
if(L->next != NULL)
ClearList(L);
for(int i = 0; i < t; i++)
ListInsert(L, i + 1, a[i]);
return OK;
}
有一点小改动,不过问题还是一样
代码还是贴完整吧,部分代码看不出来