学后一年重看数据结构,确实难啊,搞了半天才搞明白这个小问题。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef char ElemType;
typedef struct Node /*结点类型定义*/
{
ElemType data;
struct Node * next;
} Node, *LinkList; /* LinkList为结构指针类型*/
void CreateFromTail(LinkList L)
{
Node *r, *s;
char c;
int flag =1; /*设置一个标志,初值为1,当输入"$"时,flag为0,建表结束*/
r=L; /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
while(flag) /*循环输入表中元素值,将建立新结点s插入表尾*/
{
c=getchar();
if(c!='$')
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL; /*将最后一个结点的next链域置为空,表示链表的结束*/
}
}
}
void DelList(LinkList L)
{
Node *p,*q,*r;
p=L->next;
while(p) /*判断链表是否结束*/
{
q=p; /*指在相同位置*/
while(q->next) /*判断链表是否结束*/
{
if(q->next->data==p->data) /*判断相邻节点是否相等*/
{
r=q->next;
q->next=r->next; /*删除重复节点*/
free(r); /*释放r*/
}
else
q=q->next; /*指针往后移*/
}
p=p->next; /*指针往后移*/
}
}
int main()
{
LinkList l;
Node *p;
int i;
char *c;
l=(Node * )malloc(sizeof(Node));
l->next=NULL;
printf("请输入链表数据,以$结束!\n");
CreateFromTail(l);
DelList(l);
p = l->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
}