如何用C语言创建一个链表,实现增、删、改、查?

如何用C语言创建一个链表,实现增、删、改、查?,第1张

#include\x0d\x0a#include\x0d\x0a#include \x0d\x0a//先定义一种student类型,表示一个学生的信息,如下:\x0d\x0atypedef struct student\x0d\x0a{\x0d\x0aint num//表示学号\x0d\x0achar name[30]//表示姓名\x0d\x0afloat score//表示分数\x0d\x0a}student\x0d\x0a//定义一种NODE类型,表示一个结点信息,如下:\x0d\x0atypedef struct node\x0d\x0a{\x0d\x0astudent st//表示一个学生的信息\x0d\x0astruct node *next//表示一个NODE类型的指针\x0d\x0a}NODE\x0d\x0a//1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:\x0d\x0aNODE *creat_link(int direction)\x0d\x0a{\x0d\x0aNODE *head,*p,*tail\x0d\x0aint xh,i=1\x0d\x0aif(direction==1) //当direction的值为1时,新建立的结点连到尾部\x0d\x0a{\x0d\x0atail=head=(NODE *)malloc(sizeof(NODE))\x0d\x0ahead->next=NULL\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE))\x0d\x0ap->st.num=xh\x0d\x0aprintf("请输入第%d个学生的姓名:",i)\x0d\x0ascanf("%s",p->st.name)\x0d\x0aprintf("请输入第%d个学生的成绩:",i)\x0d\x0ascanf("%f",&p->st.score)\x0d\x0ap->next=NULL\x0d\x0atail->next=p\x0d\x0atail=p\x0d\x0ai=i+1\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0a}\x0d\x0a}\x0d\x0aelse if(direction==0) //当direction为0时,新建立的结点成为第一个结点\x0d\x0a{\x0d\x0ahead=(NODE *)malloc(sizeof(NODE))\x0d\x0ahead->next=NULL\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕\x0d\x0a{\x0d\x0ap=(NODE *)malloc(sizeof(NODE))\x0d\x0ap->st.num=xh\x0d\x0aprintf("请输入第%d个学生的姓名:",i)\x0d\x0ascanf("%s",p->st.name)\x0d\x0aprintf("请输入第%d个学生的成绩:",i)\x0d\x0ascanf("%f",&p->st.score)\x0d\x0ap->next=head->next\x0d\x0ahead->next=p\x0d\x0ai=i+1\x0d\x0aprintf("请输入第%d个学生的学号:",i)\x0d\x0ascanf("%d",&xh)\x0d\x0a}\x0d\x0a}\x0d\x0areturn head\x0d\x0a}\x0d\x0a//2、写出输出上述链表各结点数据域值的函数。该函数对应的函数需要一个形参,表示链表的头指针,形式如下:\x0d\x0avoid print_link(NODE *head)\x0d\x0a{\x0d\x0aNODE *p\x0d\x0ap=head->next\x0d\x0aprintf("%-10s%-20s%-10s\n","学号","姓名","分数")\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aprintf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score)\x0d\x0ap=p->next\x0d\x0a}\x0d\x0a//该函数能输出head所指的链表的所有结点值,输出形式如下:\x0d\x0a/*本函数输出线性表sq中所有数据,形式如下:\x0d\x0a学号 姓名 分数\x0d\x0a12 张三 234.5\x0d\x0a18 李四 987.7\x0d\x0a??? ??? ??.*/\x0d\x0a}\x0d\x0a//3、写出在链表中删除结点的函数\x0d\x0aint del_link(NODE *head,char name[])\x0d\x0a{\x0d\x0aNODE *p,*p1\x0d\x0ap=head->next\x0d\x0ap1=head\x0d\x0awhile(p!=NULL)\x0d\x0a{\x0d\x0aif(strcmp(p->st.name,name)!=0)\x0d\x0a{\x0d\x0ap1=p\x0d\x0ap=p->next\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0abreak\x0d\x0a}\x0d\x0a}\x0d\x0aif(p!=NULL)\x0d\x0a{\x0d\x0ap1->next=p->next\x0d\x0afree(p)\x0d\x0areturn 1\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0areturn 0\x0d\x0a}\x0d\x0a//删除head所指的链表中,名字为name的结点,删除成功返回1,不成功返回0\x0d\x0a}\x0d\x0a//4、写出在链表中插入结点的算法\x0d\x0aint insert(NODE *head,student x,int wz)\x0d\x0a{\x0d\x0aNODE *p=head\x0d\x0aint i=0,jg\x0d\x0aif(wznext\x0d\x0a}\x0d\x0aif(p==NULL)\x0d\x0a{\x0d\x0ajg=0\x0d\x0a}\x0d\x0aif(i=wz-1)\x0d\x0a{\x0d\x0a//找到wz前面的节点,p指向它\x0d\x0aNODE *q\x0d\x0aq=(NODE *)malloc(sizeof(NODE))\x0d\x0aq->st.num=x.num\x0d\x0astrcpy(q->st.name,x.name)\x0d\x0aq->st.score=x.score\x0d\x0aq->next=p->next\x0d\x0ap->next=q\x0d\x0ajg=1\x0d\x0a}\x0d\x0a}\x0d\x0areturn jg\x0d\x0a//该函数能够在wz这个结点之前,插入一个新结点,新结点的数据域为x。插入成功返回1,不成功返回0。\x0d\x0a}\x0d\x0a//5、写出主函数,分别调用上面算法所对应的程序,建立链表,并输出链表的值。\x0d\x0avoid main()\x0d\x0a{\x0d\x0aNODE *head//定义指针变量head\x0d\x0aint wz//表示插入位置\x0d\x0achar xm[30]\x0d\x0astudent st//定义一个变量st,用来表示一个学生的信息\x0d\x0ahead=creat_link(1)\x0d\x0aprint_link(head)//调用函数建立链表,并把返回值送给head\x0d\x0a//调用函数,输出链表中各个结点的值\x0d\x0a//输入一个学生的有关信息,送给变量st的有关成员\x0d\x0aprintf("\n\n请输入要插入的位置:")\x0d\x0ascanf("%d",&wz)//输入wz的值\x0d\x0aprintf("请输入要插入的学生的学号:")\x0d\x0ascanf("%d",&st.num)\x0d\x0aprintf("请输入要插入的学生的姓名:")\x0d\x0ascanf("%s",st.name)\x0d\x0aprintf("请输入要插入的学生的成绩:")\x0d\x0ascanf("%f",&st.score)\x0d\x0a//调用函数,在链表中把学生st的值作为一个结点插入,如果插入成功,输出新链表\x0d\x0aif(insert(head,st,wz)==1)\x0d\x0a{\x0d\x0aprintf("\n插入成功,新表为:\n")\x0d\x0aprint_link(head)\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("插入不成功")\x0d\x0a}\x0d\x0a//调用函数,在链表中删除一个指定结点的值,如果删除成功,输出新链表\x0d\x0aprintf("\n\n请输入要删除的学生的姓名:")\x0d\x0agetchar()\x0d\x0agets(xm)\x0d\x0aif(del_link(head,xm)==1)\x0d\x0a{\x0d\x0aprintf("\n删除成功,新表为:\n")\x0d\x0aprint_link(head)\x0d\x0a}\x0d\x0aelse\x0d\x0a{\x0d\x0aprintf("删除不成功")\x0d\x0a}\x0d\x0a}

#include<stdio.h>

#include<malloc.h>

typedef struct st

{

    int num

    struct st *next

}ST

void stPrintf(ST *stHead)

ST *insertST(ST **stHead,ST *stTail)//向链表插入节点,返回尾节点

ST *findByOrd(ST *stHead,int n)//通过节点顺序编号(从1开始)查找节点,返回该节点的前一个节点

ST *deleteST(ST *stHead,ST *stTail)//删除节点

int main()

{

    ST *stHead=NULL,*stTail=NULL

    stTail=insertST(&stHead,stTail)//插入,想插入几个节点,就调用几次

    stTail=insertST(&stHead,stTail)

    stTail=insertST(&stHead,stTail)

    stPrintf(stHead)

    deleteST(stHead,stTail)// 删除,想删几次调用几次

    stPrintf(stHead)

    deleteST(stHead,stTail)

    stPrintf(stHead)

    return 0

}

void stPrintf(ST *stHead)

{

    printf("当前链表各节点的数值是:")

    while(stHead->next!=NULL)

    {

        printf("%d ",stHead->next->num)

        stHead=stHead->next

    }

    printf("\n")

}

ST *insertST(ST **stHead,ST *stTail)

{

    int num

    ST *stNew=NULL

    stNew=(ST *)malloc(sizeof(ST))

    printf("给新节点输入一个数字:")

    scanf("%d",&num)

    stNew->num=num

    stNew->next=NULL

    if(*stHead==NULL)

    {

        *stHead=(ST *)malloc(sizeof(ST))

        (*stHead)->next=stNew

        printf("创建首节点\n")

    }

    else

    {

         stTail->next=stNew

         printf("创建新节点\n")

    }

    stTail=stNew

    return stTail

}

ST *findByOrd(ST *stHead,int n)

{

    int cnt=0

    while(stHead->next!=NULL)

    {

        cnt++

        if(cnt==n)

            return stHead

        stHead=stHead->next

    }

    printf("未找到对应节点\n")

    return NULL

}

ST *deleteST(ST *stHead,ST *stTail)

{

    int n

    ST *stFind=NULL,*stNext=NULL

    printf("请输入要删除第几个节点:")

    scanf("%d",&n)

    stFind=findByOrd(stHead,n)

    if(stFind!=NULL)

    {

        if(stTail==stFind->next)

            stTail=stFind

        stNext=stFind->next->next

        free(stFind->next)

        stFind->next=stNext

        printf("节点删除成功!\n")

    }

    else

        printf("节点删除失败!\n")

    return stTail

}

以前给别人做的一个链表,给你用功能富裕了你看看吧:

#include

"stdio.h"

struct

Node

{

Node

*pNext

int

value

}*pTop

struct

Node*

Insert(struct

Node

*pNode,int

Num)

void

Del(struct

Node

*pDelNode)

struct

Node*

Search(struct

Node

*pNode,int

Num)

void

main()

{

pTop=NULL

int

i,k,x,y

struct

Node

*pCurrentNode,*pTempNode

/*(1)建立带表头结点的单链表;*/

for(i=0i<30i++)

Insert(NULL,i)/*建立一个有30个结点的链表*/

/*(2)输出单链表中所有结点的数据域值;*/

pCurrentNode=pTop

while(pCurrentNode!=NULL)

{

printf("%d->",pCurrentNode->value)/*遍历这个链表并输出其各结点的数据域*/

pCurrentNode=pCurrentNode->pNext

}

/*(3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y*/

printf("Input

x,y")

scanf("%d,%d",&x,&y)

pCurrentNode=Search(NULL,x)

Insert(pCurrentNode,y)

/*(4)输入k,删除单链表中所有的结点k,并输出被删除结点的个数。

*/

printf("Input

k")

scanf("%d",&k)

pCurrentNode=pTop

i=0

while(1)

{

pTempNode=Search(pCurrentNode,x)

if(pTempNode!=NULL)

{

pCurrentNode=pTempNode->pNext

Del(pTempNode)

i++

}

else

break

}

printf("%d

Nodes

was

deleted",i)

pTempNode=pTop

while(pTop!=NULL)

{

pTop=pTempNode->pNext

delete

pTempNode

}

}

Node*

Insert(struct

Node

*pNode,int

Num)

{

struct

Node

*pNewNode

pNewNode=new

Node

pNewNode->value=Num

if(pNode==NULL)/*无确定插入位置时将结点放在链表最后*/

{

if(pTop!=NULL)/*确定链表是否是空表*/

{

pNode=pTop

while(pNode->pNext!=NULL)

pNode=pNode->pNext/*找到尾结点*/

pNode->pNext=pNewNode

}

else

{

pTop=pNewNode

}

pNewNode->pNext=NULL

}

else/*有确定插入位置时将结点放在指定结点之后*/

{

pNewNode->pNext=pNode->pNext

pNode->pNext=pNewNode

}

return

pNewNode

}

void

Del(struct

Node

*pDelNode)

{

if(pDelNode==NULL

||

pTop==NULL)

return/*防错处理*/

struct

Node

*pNode

pNode=pTop

while(pNode!=NULL

&&

pNode->pNext!=pDelNode)

pNode=pNode->pNext/*找到指定结点的前导结点*/

if(pNode!=NULL)

{

pNode->pNext=pDelNode->pNext

delete

pDelNode

}

}

struct

Node*

Search(struct

Node

*pNode,int

Num)

{

struct

Node

*pSeaNode

if(pNode==NULL)

pSeaNode=pTop/*不指定搜索的起始位置,从表头开始*/

else

pSeaNode=pNode/*指定了搜索的起始位置,从指定位置开始*/

while(pSeaNode!=NULL

&&

pSeaNode->value!=Num)

pSeaNode=pSeaNode->pNext

return

pSeaNode/*没有找到结点时返回空指针*/

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11642435.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存