主题:对单链表中几种”复杂“问题的程序斑竹你修改一下 我觉得可以作为精贴的
晚上写的 自己的电脑不能上网 郁闷死了
调了一下 有语法错误 不知道在那里 我用的编译器为WIN TC 如果大家有时间看帮我看看
/*本程序的目的是对单连表总元素进行 排序 倒置 和删除相同的元素*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10 /*代表要处理的元素个数*/
#define OK 1
#define NULL 0
#define OVERFLOW 0
typedef int ElemType;
typedef int status;
typedef struct Node{ ElemType data;
struct Node *next;
}Node,*LinkList;
status InitLinkList(LinkList L) /*初始化单链表*/
{ Node *p,*q;
int i;
L=(LinkList)malloc(sizeof(Node));
printf("请输入元素"); /*元素个数为N*/
if(!L)
{ printf("out of memory");
exit(OVERFLOW);
}
L->next=NULL;
p=L;
for(i=0;i<N;i++)
{ q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
scanf("%d",&(q->data));
q->next=p->next;
p->next=q;
p=q;
}
return OK;
}
status LinkListSort(LinkList L) /*对单链表的元素进行排序*/
{ Node *p;
int t ,i=0;
p=L;
while((i<(N*(N-1)/2))&&(p->next!=NULL) ) /*N为元素个数 元素要比较N*(N-1)/2次*/
{ if(p->data>p->next->data) /*相互之间换值*/
{ t=p->data;
p->data=p->next->data;
p->next->data=t;
}
i++;
p=p->next;
}
return OK;
}
status DeleteSameElement (LinkList L) /*删除相同的元素*/
{ Node *p,*q;
int x;
p=L->next;
while(p->next!=NULL)
{ q=p;
x=p->data;
p=p->data;
while(p!=NULL)
{ if(x==p->data) /*将相同的元素赋值为0 在下面判断如果元素值为0 释放这个接点*/
p->data=0;
p=p->data;
}
p=q;
p=p->next;
}
p=L->next;
while(p!=NULL)
{
if(p->next->data==0)
{
q=p->next;
p->next=q->next;
free(q);
}
}
return OK;
}
status LinkListReverse(LinkList L) /*对单链表中的元素倒置*/
{ int a[N] ,i=0,count=0;
LinkList Lb;
Node *p,*q;
p=L->next;
while(p->next!=NULL)
{
a[i++]=p->data;
p=p->data;
count++;
}
Lb=(LinkList)malloc(sizeof(Node)); /*重新建立一个单链表 将倒置后的元素放在Lb中*/
{ if(Lb==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
for(i=count;i>0;i--)
{q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
q->data=a[i];
q->next=p->next;
p->next=q;
p=q;
}
}
p=Lb->next; /*输出倒置后的单链表*/
while(p->next!=NULL)
{ printf("%4d",p->data);
}
return OK;
}
status FreeLinkList(LinkList L) /*释放接点*/
{ Node *p,*q;
p=L->next;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
return OK;
}
status PrintLinkList(LinkList L) /*打印出单链表*/
{ Node *p;
p=L->next;
printf("处理之后的单链表为:");
while(p!=NULL)
printf("%4d",p->data);
return OK;
}
调了一下 有语法错误 不知道在那里 我用的编译器为WIN TC 如果大家有时间看帮我看看
/*本程序的目的是对单连表总元素进行 排序 倒置 和删除相同的元素*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10 /*代表要处理的元素个数*/
#define OK 1
#define NULL 0
#define OVERFLOW 0
typedef int ElemType;
typedef int status;
typedef struct Node{ ElemType data;
struct Node *next;
}Node,*LinkList;
status InitLinkList(LinkList L) /*初始化单链表*/
{ Node *p,*q;
int i;
L=(LinkList)malloc(sizeof(Node));
printf("请输入元素"); /*元素个数为N*/
if(!L)
{ printf("out of memory");
exit(OVERFLOW);
}
L->next=NULL;
p=L;
for(i=0;i<N;i++)
{ q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
scanf("%d",&(q->data));
q->next=p->next;
p->next=q;
p=q;
}
return OK;
}
status LinkListSort(LinkList L) /*对单链表的元素进行排序*/
{ Node *p;
int t ,i=0;
p=L;
while((i<(N*(N-1)/2))&&(p->next!=NULL) ) /*N为元素个数 元素要比较N*(N-1)/2次*/
{ if(p->data>p->next->data) /*相互之间换值*/
{ t=p->data;
p->data=p->next->data;
p->next->data=t;
}
i++;
p=p->next;
}
return OK;
}
status DeleteSameElement (LinkList L) /*删除相同的元素*/
{ Node *p,*q;
int x;
p=L->next;
while(p->next!=NULL)
{ q=p;
x=p->data;
p=p->data;
while(p!=NULL)
{ if(x==p->data) /*将相同的元素赋值为0 在下面判断如果元素值为0 释放这个接点*/
p->data=0;
p=p->data;
}
p=q;
p=p->next;
}
p=L->next;
while(p!=NULL)
{
if(p->next->data==0)
{
q=p->next;
p->next=q->next;
free(q);
}
}
return OK;
}
status LinkListReverse(LinkList L) /*对单链表中的元素倒置*/
{ int a[N] ,i=0,count=0;
LinkList Lb;
Node *p,*q;
p=L->next;
while(p->next!=NULL)
{
a[i++]=p->data;
p=p->data;
count++;
}
Lb=(LinkList)malloc(sizeof(Node)); /*重新建立一个单链表 将倒置后的元素放在Lb中*/
{ if(Lb==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
for(i=count;i>0;i--)
{q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
q->data=a[i];
q->next=p->next;
p->next=q;
p=q;
}
}
p=Lb->next; /*输出倒置后的单链表*/
while(p->next!=NULL)
{ printf("%4d",p->data);
}
return OK;
}
status FreeLinkList(LinkList L) /*释放接点*/
{ Node *p,*q;
p=L->next;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
return OK;
}
status PrintLinkList(LinkList L) /*打印出单链表*/
{ Node *p;
p=L->next;
printf("处理之后的单链表为:");
while(p!=NULL)
printf("%4d",p->data);
return OK;
}