首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言数据结构单链式线性表有关问题

2012-05-15 
C语言数据结构单链式线性表问题麻烦大家帮我找找错误,插入元素和删除元素那块,如果输入和删除元素在线性表

C语言数据结构单链式线性表问题
麻烦大家帮我找找错误,插入元素和删除元素那块,如果输入和删除元素在线性表有的话,运行没问题,但是当输入错误的时候程序就有问题了。。
#include<stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LNode,*LinkedList;
LinkedList LinkedListset()//初始化单链表并利用尾插法建立单链表,并赋值
{
ElemType x;
LinkedList L,s,r;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
r=L;
printf("请对单链表进行整型赋值,以9999结束\n");
scanf("%d",&x);
  while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=r->next;
r->next=s;
r=s;
scanf("%d",&x);
}
if(r!=NULL) r->next=NULL;
return L;
}
void Listoutput(LinkedList L)//遍历输出单链表元素
{
LinkedList p;
p=L->next;
printf("遍历单链表为:\n");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int LinkedListLength(LinkedList L)//求出单链表的长度
{
LinkedList p;int j=0;
p=L->next;
while(p)
{
j++;
p=p->next;
}
return j;
}
int LinkedListEmpty(LinkedList L)//判断单链表是否为空
{
return (L->next==NULL?1:0);
}
int LinkedListLocate(LinkedList L,ElemType x)//查找某元素并定位
{
LinkedList p;
int j;
j=1;
p=L->next;
while(p!=NULL&&p->data!=x)
{
p=p->next;
j++;
}
if(p->data==x) return j;
else 
return 0;
}

LinkedList ListkedListInsert(LinkedList L,int i,ElemType e)//插入元素
{ //在带头节点单链表第i个节点前插入新元素e
  int j=0;LinkedList s,p;
  p=L;
  while((p!= NULL)&&(j<i-1))
  {
  p=p->next;
  j++;
  }
  if((p==NULL)||(j>i-1)) {printf("序号不合理\n");exit(0);}
  else 
{
  s = (LNode*)malloc(sizeof(LNode));
  s->data=e;
  s->next=p->next;
  p->next=s;
  }
return L;
}
LinkedList ListkedListDelete(LinkedList L,ElemType e)//删除元素
{
int j=0,i=0;
LinkedList p,pre;
if(L->next==NULL) {printf("该表为空,无法删除");exit(0);}
p=L->next;pre=L;
while(p!=NULL&&p->data!=e)
{
j++;
p=p->next;
}
if(p->data!=e) printf("对不起,你所删除的元素不存在\n");
else
while(pre->next&&i<j)//寻找删除元素结点的前驱
{
pre=pre->next;
i++;
}
p=pre->next;
pre->next=p->next;
free(p);
return L;
}
void main()
{
LinkedList L;
int b,a,c;
  L=LinkedListset();
Listoutput(L);
if(LinkedListEmpty(L))  
  printf("表为空\n");
  else printf("表不为空\n");
printf("单链式顺序表的长度为:%d\n",LinkedListLength(L));
printf("请输入你要查找的元素\n");
scanf("%d",&b);
  printf("该元素在线性表中第%d位\n",LinkedListLocate(L,b));
printf("请输入你要插入的元素的位置\n");
scanf("%d",&c);
printf("请输入你要插入的元素\n");
scanf("%d",&a);
L=ListkedListInsert(L,c,a);
Listoutput(L);
printf("请输入你要删除的元素\n");
scanf("%d",&a);
L=ListkedListDelete(L,c);
Listoutput(L);
}


[解决办法]

C/C++ code
#include<stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct Node{    ElemType data;    struct Node *next;}LNode,*LinkedList;LinkedList LinkedListset()//初始化单链表并利用尾插法建立单链表,并赋值{    ElemType x;    LinkedList L,s,r;    L=(LNode*)malloc(sizeof(LNode));    L->next=NULL;    r=L;    printf("请对单链表进行整型赋值,以9999结束\n");    scanf("%d",&x);    while(x!=9999)    {        s=(LNode*)malloc(sizeof(LNode));        s->data=x;        s->next=r->next;        r->next=s;        r=s;        scanf("%d",&x);    }    if(r!=NULL) r->next=NULL;    return L;}void Listoutput(LinkedList L)//遍历输出单链表元素{    LinkedList p;    p=L->next;    printf("遍历单链表为:\n");    while(p)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}int LinkedListLength(LinkedList L)//求出单链表的长度{    LinkedList p;int j=0;    p=L->next;    while(p)    {        j++;        p=p->next;    }    return j;}int LinkedListEmpty(LinkedList L)//判断单链表是否为空{    return (L->next==NULL?1:0);}int LinkedListLocate(LinkedList L,ElemType x)//查找某元素并定位{    LinkedList p;    int j;    j=1;    p=L->next;    while(p!=NULL&&p->data!=x)    {        p=p->next;        j++;    }    if(p!=NULL && p->data==x) return j;    else          return 0;}LinkedList ListkedListInsert(LinkedList L,int i,ElemType e)//插入元素{ //在带头节点单链表第i个节点前插入新元素e    int j=0;LinkedList s,p;    p=L;    while((p!= NULL)&&(j<i-1))    {        p=p->next;        j++;    }    if((p==NULL)||(j>i-1)) {printf("序号不合理\n");exit(0);}    else      {        s = (LNode*)malloc(sizeof(LNode));        s->data=e;        s->next=p->next;        p->next=s;    }    return L;}LinkedList ListkedListDelete(LinkedList L,ElemType e)//删除元素{    int j=0;LinkedList s,p;    int nPos = LinkedListLocate(L,e);    if (nPos==0)    {        printf("Not existing this elements\n\n");        return L;    }    p = L;    for (j=1;j<nPos;++j)    {        p=p->next;    }    s = p->next;    p->next = s->next;    free(s);    return L;}void main(){    LinkedList L;    int b,a,c;    L=LinkedListset();    Listoutput(L);    if(LinkedListEmpty(L))           printf("表为空\n");    else printf("表不为空\n");    printf("单链式顺序表的长度为:%d\n",LinkedListLength(L));    printf("请输入你要查找的元素\n");    scanf("%d",&b);    printf("该元素在线性表中第%d位\n",LinkedListLocate(L,b));    printf("请输入你要插入的元素的位置\n");    scanf("%d",&c);    printf("请输入你要插入的元素\n");    scanf("%d",&a);    L=ListkedListInsert(L,c,a);    Listoutput(L);    printf("请输入你要删除的元素\n");    scanf("%d",&a);    L=ListkedListDelete(L,a);    Listoutput(L);    printf("请输入你要删除的元素\n");    scanf("%d",&a);    L=ListkedListDelete(L,a);    Listoutput(L);} 


[解决办法]

C/C++ code
LinkedList LinkedListset()//初始化单链表并利用尾插法建立单链表,并赋值{ElemType x;LinkedList L,s,r;L=(LNode*)malloc(sizeof(LNode));L->next=NULL;r=L;printf("请对单链表进行整型赋值,以9999结束\n");scanf("%d",&x);  while(x!=9999){s=(LNode*)malloc(sizeof(LNode));s->data=x;s->next=r->next;r->next=s;r=s;scanf("%d",&x);}// if(r!=NULL) r->next=NULL;  //-------------------- 画蛇添足!你这样就将链表截断了return L;}
[解决办法]
//链表的创建 插入 删除
# include <stdio.h>
# include <malloc.h>
typedef struct node
{
int num;
char name[10];
struct node *next;
}NODE;
void creat(NODE *head,int n)
{
NODE *p;
scanf("%d",&head->num);
while(--n)
{
p=(NODE *)malloc(sizeof(NODE));
scanf("%d",&p->num);
head->next=p;
head=head->next;
}
head->next=NULL;
}
void output(NODE *head)
{
while(head!=NULL)
{
printf("%d ",head->num);
head=head->next;
}
printf("\n");
}
NODE *dele(NODE *head,int n)
{
NODE *p=head;
if(n==1)return head->next;
n-=2;
while(n--)head=head->next;
head->next=head->next->next;
return p;
}
NODE *insert(NODE *head,int n,int m)
{
NODE *p=head,*q;
q=(NODE *)malloc(sizeof(NODE));
if(n==1){q->next=head;q->num=m;return q;}
n-=2;
while(n--)head=head->next;
q->next=head->next->next;
head->next=q;
q->num=m;
return p;
}
void main()
{
NODE *head,*p;
printf("creat:");
creat(head,5);
output(head);
printf("\ndele:");
p=dele(head,2);
output(p);
printf("\ninsert:");
p=insert(p,2,33);
output(p);
getch();
}

热点排行