高分请教C语言问题

已知一个线性表,元素按值非递减有序排列,以链式存储编写一个算法删除表中多余的值相同的元素。
请对命令解释一下意思。
请按要求写出这个能在C语言环境中实现的程序
键盘输入10个非递减有序元素,然后输出删除相同元素以后的结果!~

这是我做的,你参考一下吧。
/*已知一个线性表,元素按值非递减有序排列,
以链式存储编写一个算法删除表中多余的值相同的元素。*/
#include "stdio.h"
#include "malloc.h"
#define FALSE 0
#define TRUE 1
typedef int KeyType;

typedef struct ElemType
{
int key;
}ElemType;
typedef struct /*线性表结构*/
{
ElemType *elem;
int length;
}STable;
STable *S; /*全局定义一个线性表*/

typedef struct LNode /*链表结构*/

{
int data;
struct LNode *next;
}LNode,* LinkList;
LinkList L; /*全局定义一个链表*/

void PrintF1(int n) /*输出函数。输出原线性表的值*/
{
int i;
for(i=1;i<n+1;i++)
{
printf("%d ",S->elem[i].key);
}
printf("\n");
}

void PrintF2() /*输出函数。输出改后链表的值*/
{
LinkList p=L;
for(;p;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
}

int CreateSTable(int n) /*创建一个线性表*/
{
int i,j,min,t;
S->length=n;
S->elem=(ElemType*)malloc((S->length+1)*sizeof(ElemType));
if(!S->elem) return -1;
printf("input:\n");
for(i=1;i<n+1;i++)
{

scanf("%d",&S->elem[i].key); /*输入数值,可乱序输入*/
}
for(i=1;i<n;i++) /*选择排序*/
{
min=i;
for(j=i+1;j<n+1;j++)
{
if(S->elem[min].key>S->elem[j].key)
min=j;
}
if(i!=min)
{
t=S->elem[i].key;
S->elem[i].key=S->elem[min].key;
S->elem[min].key=t;
}
}
}

LinkList CreateList() /*创建链表*/?
{
int i=0;
LinkList p,q;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
L->data=S->elem[1].key;
q=L;
for(i=2;i<=S->length;i++)
{
if(S->elem[i].key!=S->elem[i-1].key) /*满足条件则开辟空间存值*/
{
p=(LinkList)malloc(sizeof(LNode));
p->data=S->elem[i].key;
q->next=p;
p->next=NULL;
q=p;
}
}
return(L);
}

void main()
{
int n,key;
printf("n:");
scanf("%d",&n);
CreateSTable(n);
PrintF1(n);
CreateList();
PrintF2();
getch();
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-11-20
元素按值非递减有序排列 也就是说 元素按递增的趋势排列

链式存储 也就是说 以动态分配空间的方式申请每个单元 并将其用指针连接起来

删除表中多余的值相同的元素 也就是若有两个或多个的值相同 ,则仅保留一个,其它的都删除掉
第2个回答  2008-11-20
比如有1 2 2 3 3 3 4 5
那么操作后的结果就是1 2 3 4 5
把重复的删掉~~~~~~~
第3个回答  2008-11-20
void int DelMulNode(node *head)
{
node *p1,*p2;
p1 = head;
p2=head->next;
while(p2!=NULL)
{
if(p1->data == p2->data) //比较两个节点内容是否相等
{
p1->next = p2->next; //相等则删除p2节点
p2 = p1->next; //另p2重新指向p1的下一个节点
}
else
{ p1=p1->next; //不相等则另p1指向其下一个节点
p2=p1->next; //另p2等于p1所指向的下一个节点继续比较其内容
}
}

}
第4个回答  2008-11-20
struct node
{
int data;
node *next;
}
void delet(node* h)/*删除原线性表*/
{
node* p=h;
while(p!=NULL)
{
node*q=p;
p=p->next;
delete q;
}
}
void resort(note *h1)/*去除相同元素*/
{
node *h2=NULL;/*建立一个新的头节点*/
node *pre=NULL;/*当前节点指针*/
node *p=h1;
while(p!=NULL)
{
node* q;
q=new node;
q->data=p->data;
q->next=NULL;
if(h2==NULL)
{
h2=pre=q;
}
else
if(q->data==pre->data)/*若即将插入的元素与当前元素相同则不插*/
p=p->next;
else
{
pre->next=q;
pre=q;
p=p->next;
}
}
delet();/*删除原线性表释放空间*/
h1=h2;
}
相似回答