回 帖 发 新 帖 刷新版面

主题:一个有问题链表的追加,删除程序,帮忙分析一下

#include "stdio.h"
#include "stdlib.h"
typedef struct name_link{
  char *name;
  struct name_link *next;
         }*name_ptr,name_struct;   /* 定义一个以名字为分量的结构体*/

void show_link(name_ptr head)
{
     name_ptr temp1;
     temp1=head->next;
     while(temp1)
         {
              printf("%s\n",temp1->name);
              temp1=temp1->next;
         }

}                       /*遍历单链表,显示所有结点*/

name_ptr search_end(name_ptr head)
{
 name_ptr temp;
 temp=head;
 while(temp->next != 0)
         temp=temp->next;
 return temp;
}


void addname(name_ptr head)
{
      name_ptr temp1,temp2;
      char *newname;
      temp2 = search_end(head);


      temp1 =(name_ptr)malloc (sizeof(name_struct));
      printf("\nplease input the name you want to add!\n");
      scanf("%s",newname);
      temp1->name=newname;
      temp2->next = temp1;
      temp1->next = 0;

}                         /*尾部追加新结点*/


name_ptr find_prev_name(name_ptr head,char *match_name)
{
    name_ptr temp1;
    temp1=head;
    while(temp1->next != 0)
         {
            if(temp1->next->name == match_name)    return temp1;
               
                temp1=temp1->next;
          }
   
    return 0;
}                           /*找出名字匹配的结点*/
void del_node(name_ptr head,char * name)
{
    name_ptr temp1,temp2;
    
    temp1=find_prev_name(head,name);
    if(temp1)
         {
               temp2=temp1->next;
               temp1->next=temp2->next;
           free(temp2);

          }
}


int main()
{
 name_ptr head;
 char choice;
 char *del_name;
 /*head=(name_ptr)malloc(sizeof(name_struct));*/

 head->next=0;
 printf("\n          please input your choice:\n");
 printf("                1.A Add a new name;\n");
 printf("                2.D Delete a name;\n");
 printf("                3.S Show the list;\n");
 printf("                4.E End the program\n");
 scanf("%c",&choice);
 while(choice != 'E' || 'e')
       {
        switch(choice)
            {
            case 'a':
            case 'A':
                        {
                        addname(head);
                        break;
                        }
            case 'd':
            case 'D':
                 {
                    printf("\nplease input the name you want to delete!");
                    scanf("%s",del_name);
                    del_node(head,del_name);
                    break;
                  }
            case 's':
                case 'S':
                    {
                        show_link(head);
                        break;
                    }
             case 'e':
             case 'E':
                 return(0);
             default:
                 break;
        }
        printf("\nplease input your choice!");
        scanf("%c",&choice);
      }
}

回复列表 (共3个回复)

沙发

先说你不明白的出来别人才能帮你分析啊

板凳


仔细看了一下你的代码,发现一个明显的逻辑错误就是在找删除节点的位置时应该返回该接点的前一个节点的指针,而你返回的是该节点的指针,以致在编译时导致内存报错,
还有在字符串的处理上有些问题,比较两个字符串,将一个字符串赋给另一个字符串时应该用 strcmp(),strcpy() 函数,根据你的意思,我用C++编写了一段代码如下:

#include<iostream.h>
#include<malloc.h>
#include<iomanip.h>
#include<string.h>
#define null 0
struct LinkList{
    struct LinkList *next;
    char name[20];
};
LinkList *Creat();
LinkList *Find_endnode(LinkList *head);
LinkList *Del_node(LinkList *head, char *cha);
void Insert(LinkList *head, char *cha);
void Del(LinkList *head,char *cha);
void Output(LinkList *head);
void main()
{
    LinkList *head=Creat();
    char c[20],choice;
    cout<<"A:increase a node!"<<endl;
    cout<<"B:del a node!"<<endl;
    cout<<"C:output the LinkList!"<<endl;
    cout<<"D:exit!"<<endl;
    cout<<"please select:";
    cin>>choice;
    while(choice!='D'&&choice!='d')
    {
        switch(choice)
        {
        case 'A':
        case 'a':{cout<<"input a insert name:";
                  cin>>c;
                  Insert(head,c);}break;
        case 'B':
        case 'b':{cout<<"input del name:";
                  cin>>c;
                  Del(head,c);}break;
        case 'C':
        case 'c':Output(head);break;
        case 'D':
        case 'd':return;
        default :cout<<"error select"<<endl;
        }
        cout<<"please select:";
        cin>>choice;
    }
    
}
LinkList *Creat()
{
    LinkList *head;
    head=(LinkList *)malloc(sizeof(LinkList));
    head->next=null;
    return head;
}
LinkList *Find_endnode(LinkList *head)
{
    LinkList *p=head;
    while(p->next!=null)
        p=p->next;
    return p;
}
LinkList *Del_node(LinkList *head, char *cha)
{
    LinkList *p=head,*q;
    while(p->next!=null)
    {
        q=p;
        p=p->next;
        if(0==strcmp(p->name,cha))return q;
    }
    return null;
}
void Insert(LinkList *head, char *cha)
{
    LinkList *endnode=Find_endnode(head);
    LinkList *newnode=(LinkList *)malloc(sizeof(LinkList));
    strcpy(newnode->name,cha);
    newnode->next=endnode->next;
    endnode->next=newnode;
}
void Del(LinkList *head,char *cha)
{
    LinkList *delnode=Del_node(head,cha);
    if(delnode==null)cout<<"not exist"<<endl;
    else
    {
        LinkList *p=delnode->next;
        delnode->next=p->next;
    }
}
void Output(LinkList *head)
{
    LinkList *p=head;
    if(p->next==null)cout<<"not have chars"<<endl;
      else
    while(p->next!=null)
    {
        p=p->next;
        cout<<"     "<<p->name;
    }
    cout<<endl;
}

[em9][em9][em9]

3 楼

2楼的程序比较完整。
我稍点点东西

void Del(LinkList *head,char *cha)
{
    LinkList *delnode=Del_node(head,cha);
    if(delnode==null)cout<<"not exist"<<endl;
    else
    {
        LinkList *p=delnode->next;
        delnode->next=p->next;
        delete p;    /////////////////////////
    }
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册