用c语言解决这个问题。

img


刚学数据结构(c语言版),不是特别明白,网课也没怎么看懂,自己敲了几个小时也没结果,希望能解答一下。

题主你好:

img

代码如下:

#include<stdio.h>
#include<stdlib.h>

typedef struct node_t
{
    int data;
    struct node_t* next;
}LinkNode_t;

LinkNode_t* createLinkList();
int emptyLinkList(LinkNode_t* p);
int lengthLinkList(LinkNode_t* p);
int insertLinkList(LinkNode_t* p,int pos,int x);
void printLinkList(LinkNode_t* p);
int getLinkList(LinkNode_t* p,int pos);
int deleteLinkList(LinkNode_t* p,int pos);
void clearLinkList(LinkNode_t* p);
void ReversePrintList(LinkNode_t* p);

int main()    
{    
    LinkNode_t* head = createLinkList();//创建一个链表的空头结点
    
    printf("(1)建立线性表(a,b,c,d,e,f,g,h,i,j)\n");    
    int i;
    for(i='a';i<='j';i++)
    {
        insertLinkList(head,i-'a',i);//在i-'a'位置插入i
    }                            //a,b,c,d,e,f,g,h,i,j

    printf("(2)把线性表的所有元素输出到屏幕上\n");    
    printLinkList(head);

    printf("(3)从线性表中输出元素g\n");
    printf("%c\n",getLinkList(head,6));

    printf("(4)在线性表的第5个元素前插入y元素\n");
    insertLinkList(head,4,'y');//插入y            //a,b,c,d,y,e,f,g,h,i,j

    printf("(5)从线性表中删除第三个元素并把它输出到屏幕上\n");
    printf("%c\n",getLinkList(head,2));        
    deleteLinkList(head,2);                    //a,b,d,y,e,f,g,h,i,j

    printf("(6)最后把线性表的所有元素再次输出到屏幕上\n");
    printLinkList(head);


    deleteLinkList(head,0);//删除链表

    return 0;
}

/*
 功能:创建一个链表的空头结点(堆空间)返回头结点的地址
 参数:新结点的值
 返回值:空链表的头结点指针
 */
LinkNode_t* createLinkList()
{
    LinkNode_t* node =(LinkNode_t*)malloc(sizeof(LinkNode_t));
    node->next = NULL;
    return node;
}

/* 
功能:判断链表是否为空
参数:链表头结点指针
返回值:空返回1 非空返回0
*/
int emptyLinkList(LinkNode_t* p)
{
    return p->next == NULL;
}

/*
 功能:计算链表中除空头结点之外的结点个数
 参数:链表头结点指针
 返回值:结点个数
 */
int lengthLinkList(LinkNode_t* p)
{
    int count = 0;
    LinkNode_t* t = p->next;
    while(t!=NULL)
    {
        count++;
        t = t->next;
    }
    return count;
}

/*
功能:在链表中插入新结点并存入数据
参数1:链表头结点指针
参数2:插入的位置(第一个有数据的结点位置为0)
参数3:新结点的值
返回值:成功返回0 失败返回-1
*/
int insertLinkList(LinkNode_t* p,int pos,int x)
{
    if(pos<0||pos>lengthLinkList(p))
    {    
        return -1;
    }
    LinkNode_t* newNode = (LinkNode_t*)malloc(sizeof(LinkNode_t));
    newNode->data = x;//赋值
    newNode->next = NULL;

    LinkNode_t* t=p;//指向空头,从空头开始遍历
    int i;
    for(i = 0;i < pos;i++)
    {
        t = t->next;
    }
    //将结点插入链表
    newNode->next = t->next;
    t->next = newNode;
    return 0;
}
/*
功能:获得链表中某结点的值
参数1:链表头结点指针
参数2:位置(第一个有数据的结点位置为0)
返回值:失败返回-1 成功返回参数2位置结点的值
*/
int getLinkList(LinkNode_t* p,int pos)
{
    if(pos<0||pos>lengthLinkList(p))
    {
        return -1;
    }
    int i;
    LinkNode_t* t = p->next;
    for(i=0;i<pos;i++)
    {
        t = t->next;
    }
    return t->data;
}

/*
功能:遍历输出链表中结点的值
参数:链表头结点指针
返回值:无
*/
void printLinkList(LinkNode_t* p)
{
    printf("有效数据结点数:%d\n",lengthLinkList(p));
    int count = 0;
    LinkNode_t* t = p->next;
    while(t!=NULL)
    {
        printf("NODE[%d]:%c\n",count,t->data);
        t = t->next;
        count++;
    }
}
/*
功能:删除参数位置结点
参数1:链表头结点指针
参数2:删除位置
返回值:失败返回-1 成功返回0
*/
int deleteLinkList(LinkNode_t* p,int pos)
{
    if(pos<0||pos>=lengthLinkList(p))
    {
        return -1;
    }
    int i;
    LinkNode_t* t = p;//指向空头
    for(i=0;i<pos;i++)
    {
        t = t->next;
    }
    LinkNode_t* s = t->next;//保存要删除结点的地址
    t->next = t->next->next;//连接待删除结点的前后两个结点
    free(s);
    return 0;
}

/*
功能:清空链表
参数:链表头结点指针
*/
void clearLinkList(LinkNode_t* p)
{
    while(p!=NULL)
    {
        LinkNode_t* t = p;
        p = p->next;
        free(t);
    }
}
/*
功能:反向打印链表
参数:链表头结点指针
*/ 
void ReversePrintList(LinkNode_t* p)
{
    static int count=0;
    if(p->next!=NULL)
    {
        count++;
        ReversePrintList(p->next);
        count--;
        printf("NODE[%d]:%d\n",count,p->next->data);
        return;
    }
    return;
}




就是用链表完成这些功能

#include <stdio.h>
#include <stdlib.h>
typedef struct _node
{
    char data;
    struct _node *next;
}node;

node* createList()
{
    node *head = (node*)malloc(sizeof(node));
    node *q = head;
    head->next = NULL;
    for(int i=0;i<10;i++)
    {
        node *p = (node*)malloc(sizeof(node));
        p->data = 'a'+i;
        p->next = NULL;
        q->next = p;
        q = p;
    }
    return head;
}

void showList(node *head)
{
    node *p = head;
    while(p->next != NULL)
    {
        printf("%c ",p->next->data);
        p = p->next;
    }
    printf("\n");
}

void findNode(node *head,char data)
{
    node *p = head;
    while(p->next != NULL)
    {
        if(p->next->data == data)
        {
            printf("%c\n",p->next->data);
            break;
        }
        p = p->next;
    }
}

void insertNode(node *head,char data,int idx)
{
    node *p = head;
    while(idx>1 && p->next != NULL)
    {
        p = p->next;
        idx--;
    }
    if(p->next != NULL)
    {
        node *q = (node*)malloc(sizeof(node));
        q->data = data;
        q->next = p->next;
        p->next = q;
    }
}

void removeNode(node *head,int idx)
{
    node *p = head;
    while(idx>1 && p->next != NULL)
    {
        p = p->next;
        idx--;
    }
    if(p->next != NULL)
    {
        node *q = p->next;
        p->next = q->next;
        printf("%c\n",q->data);
        free(q);
    }
}

int main()
{
    node *head = createList();
    showList(head);
    findNode(head,'g');
    insertNode(head,'y',5);
    removeNode(head,3);
    showList(head);
    return 0;
}


可以看下c语言参考手册中的 c语言-exp()