求精通数据结构的大神讲解一下C语言的这段代码

2025-06-23 06:19:54
推荐回答(3个)
回答1:

我帮你注释了一下,下图为运行结果

以下为你的代码:

#include 
#include 
#include 
typedef struct _Node
{
    char name[32];
    struct _Node *next;
} Node;
typedef struct _Node *PtrNode;//建立指向_Node类型数据的指针*PtrNode
void InitList(PtrNode *ls)//初始化链表
{
    *ls = (PtrNode)malloc(sizeof(Node));
    strcpy((*ls)->name, "Nothing"); //默认name值为Noting
    (*ls)->next = NULL;//默认为空指针
}
void CreateList(PtrNode ls, int n)//尾插法建立链表,结点数为n个
{
    PtrNode p, rear;
    char tmpName[32];//声明字符数组
    int i;
    rear = ls;
    for(i=0; i    {
        p = (PtrNode)malloc(sizeof(Node));
        scanf("%s", tmpName);
        strcpy(p->name, tmpName);
        rear->next = p;  //给p节点的name、next赋值
        rear = p;   //rear回到链表最后位置
    }
    rear->next = NULL;  //链表尾节点指向空
}
void TraverseList(PtrNode ls) //遍历打印
{
    PtrNode p=ls->next;//p指向第一个结点
    while(p!=NULL)
    {
        printf("%s->", p->name);
        p = p->next;
    }
    printf("null\n");
}
PtrNode LocateElem(PtrNode ls, char key_name[32])//查找name值等于参数key_name的第一个结点,没有则返回空
{
    PtrNode p, q;
    p = ls;
    q = ls->next;
    while(q!=NULL)
    {
        if(strcmp(q->name, key_name)==0)
            break;  //找到与key_name相等的元素后直接跳出循环
        p = q;
        q = q->next;
    }
    if(q==NULL)
        return NULL;
    else
        return p;//此时p->next就是要找的结点
}
PtrNode GetElem(PtrNode ls, int j)//找到链表中第j个结点
{
    PtrNode p=ls;
    int i=0;
    if(j<0) return NULL;//参数不能小于0
    while(p!=NULL&&i    {
        p=p->next;
        i++;
    }
    return p;
}
void InsertNode(PtrNode p, char newName[32])//将name值为newName的新结点插入到p的当前位置,p自动后移
{
    PtrNode s = (PtrNode)malloc(sizeof(Node));
    strcpy(s->name, newName);
    s->next = p->next;
    p->next = s;
}
void DeleteNode(PtrNode p)//删除结点p
{
    PtrNode s=p->next;//暂存p的next值
    if(s!=NULL)
    {
        p->next = s->next;
        free(s);//销毁这个结点
    }
}
void DestroyList(PtrNode *ls)//销毁链表ls
{
    PtrNode p = *ls, q;
    while(p!=NULL)//用p遍历ls,依次销毁ls的每一个结点
    {
        q = p;
        p = p->next;
        free(q);
    }
    *ls = NULL;
}
int GetLength(PtrNode ls)//返回ls的结点个数
{
    PtrNode p=ls->next;
    int i=0;
    while(p!=NULL)
    {
        p=p->next;
        i++;
    }
    return i;
}
void BubbleSort(PtrNode ls)//对链表进行冒泡排序,最终为升序
{
    int i, j, n = GetLength(ls);
    int bFlag=1;
    char tmpName[32];
    PtrNode p, q;
    for(i=0; i    {
        bFlag = 0;
        p = ls->next;
        for(j=0; j        {
            q = p->next;
            if(strcmp(p->name, q->name)>0)//strcmp:比较英文字符串大小,参数1大于参数2时执行if内的语句
            {         //百度百科:strcmp
                strcpy(tmpName, p->name);
                strcpy(p->name, q->name);
                strcpy(q->name, tmpName);//对调p和q的name值
                bFlag = 1;
            }
            p = p->next;
        }
    }

//-------------------------------------------
int main()
{
    int n=4;
    PtrNode myLkList, pNode;
    char keyName[32], newName[32];
    InitList(&myLkList);//初始化
    CreateList(myLkList, n);//插入4个结点
    TraverseList(myLkList);//遍历打印
 printf("请输入要查找的关键字\n");
    scanf("%s", keyName);//输入要查找的keyName
    pNode=LocateElem(myLkList, keyName);//pNode为此keyName的位置下标
    if(pNode!=NULL)//若存在这个keyName就在这个结点的下一个位置插入一个新结点
    {
  printf("请输入要添加的新结点\n");
  scanf("%s", newName);
     InsertNode(pNode, newName);
 }
    TraverseList(myLkList);//遍历打印
    pNode = GetElem(myLkList, 4);//查到到第4个结点
    if(pNode!=NULL)//将此结点之后的统统删除
        DeleteNode(pNode);
 printf("删除第四个以后的结点:\n");
    TraverseList(myLkList);//遍历打印
    return 0;
}

回答2:

typedef struct _Node
{
char name[32];
struct _Node *next;
}Node;
typedef struct _Node * PtrNode;
是构造结构体的
void InitList(PtrNode *ls)初始化结构体的,第一个结点为nothing
void CreateList(PtrNode ls, int n) 创建一个结点数为n的线性表,其中各个结点的name自己输入
void TraverseList(PtrNode ls) 输出整个线性表,最后输出null
PtrNode LocateElem(PtrNode ls, char key_name[32]) 查找第二个形参的值是否存在于ls指向的线性表中,若存在,输出指向该结点的指针,若不存在,则返回null
PtrNode GetElem(PtrNode ls, int j) 输出第j个结点的指针
void InsertNode(PtrNode p, char newName[32]) 往p的后边插入一个结点
void DeleteNode(PtrNode p) 删除p结点
void DestroyList(PtrNode *ls) 删除ls 线性表
int GetLength(PtrNode ls) 返回ls线性表的长度
void BubbleSort(PtrNode ls) 排序的
望采纳

回答3:

没什么难的呀,估计你是不理解指针吧