㈠ 用C语言编写一个链表
看完你下面的追问 其实 意思是
让你把一个已有的 单链表
变成反向的单链表 对吧
㈡ 用C语言实现链表的建立插入查询删除输出
#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=0;i<30;i++)
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;/*没有找到结点时返回空指针*/
}
㈢ 如何用C语言创建一个链表,实现增、删、改、查
#includex0dx0a#includex0dx0a#include x0dx0a//先定义一种student类型,表示一个学生的信息,如下:x0dx0atypedef struct studentx0dx0a{x0dx0aint num; //表示学号x0dx0achar name[30]; //表示姓名x0dx0afloat score; //表示分数x0dx0a}student;x0dx0a//定义一种NODE类型,表示一个结点信息,如下:x0dx0atypedef struct nodex0dx0a{x0dx0astudent st; //表示一个学生的信息x0dx0astruct node *next; //表示一个NODE类型的指针x0dx0a}NODE;x0dx0a//1、写出建立一个带头结点的线性链表的函数,其中每个结点包括学号、姓名、分数三个数据域。函数形式如下:x0dx0aNODE *creat_link(int direction)x0dx0a{x0dx0aNODE *head,*p,*tail;x0dx0aint xh,i=1;x0dx0aif(direction==1) //当direction的值为1时,新建立的结点连到尾部x0dx0a{x0dx0atail=head=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("请输入第%d个学生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("请输入第%d个学生的成绩:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=NULL;x0dx0atail->next=p;x0dx0atail=p;x0dx0ai=i+1;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0aelse if(direction==0) //当direction为0时,新建立的结点成为第一个结点x0dx0a{x0dx0ahead=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //从键盘临时输入学生情况,当输入的学号非正,则链表建立完毕x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("请输入第%d个学生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("请输入第%d个学生的成绩:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=head->next;x0dx0ahead->next=p;x0dx0ai=i+1;x0dx0aprintf("请输入第%d个学生的学号:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0areturn head;x0dx0a}x0dx0a//2、写出输出上述链表各结点数据域值的函数。该函数对应的函数需要一个形参,表示链表的头指针,形式如下:x0dx0avoid print_link(NODE *head)x0dx0a{x0dx0aNODE *p;x0dx0ap=head->next;x0dx0aprintf("%-10s%-20s%-10s\n","学号","姓名","分数");x0dx0awhile(p!=NULL)x0dx0a{x0dx0aprintf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score);x0dx0ap=p->next;x0dx0a}x0dx0a//该函数能输出head所指的链表的所有结点值,输出形式如下:x0dx0a/*本函数输出线性表sq中所有数据,形式如下:x0dx0a学号 姓名 分数x0dx0a12 张三 234.5x0dx0a18 李四 987.7x0dx0a??? ??? ??.*/x0dx0a}x0dx0a//3、写出在链表中删除结点的函数x0dx0aint del_link(NODE *head,char name[])x0dx0a{x0dx0aNODE *p,*p1;x0dx0ap=head->next;x0dx0ap1=head;x0dx0awhile(p!=NULL)x0dx0a{x0dx0aif(strcmp(p->st.name,name)!=0)x0dx0a{x0dx0ap1=p;x0dx0ap=p->next;x0dx0a}x0dx0aelsex0dx0a{x0dx0abreak;x0dx0a}x0dx0a}x0dx0aif(p!=NULL)x0dx0a{x0dx0ap1->next=p->next;x0dx0afree(p);x0dx0areturn 1;x0dx0a}x0dx0aelsex0dx0a{x0dx0areturn 0;x0dx0a}x0dx0a//删除head所指的链表中,名字为name的结点,删除成功返回1,不成功返回0x0dx0a}x0dx0a//4、写出在链表中插入结点的算法x0dx0aint insert(NODE *head,student x,int wz)x0dx0a{x0dx0aNODE *p=head;x0dx0aint i=0,jg;x0dx0aif(wz<=0)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aelsex0dx0a{x0dx0awhile(inext;x0dx0a}x0dx0aif(p==NULL)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aif(i=wz-1)x0dx0a{x0dx0a//找到wz前面的节点,p指向它x0dx0aNODE *q;x0dx0aq=(NODE *)malloc(sizeof(NODE));x0dx0aq->st.num=x.num;x0dx0astrcpy(q->st.name,x.name);x0dx0aq->st.score=x.score;x0dx0aq->next=p->next;x0dx0ap->next=q;x0dx0ajg=1;x0dx0a}x0dx0a}x0dx0areturn jg;x0dx0a//该函数能够在wz这个结点之前,插入一个新结点,新结点的数据域为x。插入成功返回1,不成功返回0。x0dx0a}x0dx0a//5、写出主函数,分别调用上面算法所对应的程序,建立链表,并输出链表的值。x0dx0avoid main()x0dx0a{x0dx0aNODE *head; //定义指针变量headx0dx0aint wz; //表示插入位置x0dx0achar xm[30];x0dx0astudent st; //定义一个变量st,用来表示一个学生的信息x0dx0ahead=creat_link(1);x0dx0aprint_link(head); //调用函数建立链表,并把返回值送给head;x0dx0a//调用函数,输出链表中各个结点的值x0dx0a//输入一个学生的有关信息,送给变量st的有关成员x0dx0aprintf("\n\n请输入要插入的位置:");x0dx0ascanf("%d",&wz); //输入wz的值x0dx0aprintf("请输入要插入的学生的学号:");x0dx0ascanf("%d",&st.num);x0dx0aprintf("请输入要插入的学生的姓名:");x0dx0ascanf("%s",st.name);x0dx0aprintf("请输入要插入的学生的成绩:");x0dx0ascanf("%f",&st.score); x0dx0a//调用函数,在链表中把学生st的值作为一个结点插入,如果插入成功,输出新链表x0dx0aif(insert(head,st,wz)==1)x0dx0a{x0dx0aprintf("\n插入成功,新表为:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("插入不成功");x0dx0a}x0dx0a//调用函数,在链表中删除一个指定结点的值,如果删除成功,输出新链表x0dx0aprintf("\n\n请输入要删除的学生的姓名:");x0dx0agetchar();x0dx0agets(xm);x0dx0aif(del_link(head,xm)==1)x0dx0a{x0dx0aprintf("\n删除成功,新表为:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("删除不成功");x0dx0a}x0dx0a}
㈣ C语言 求双向链表的简单例子
一下是含指针的代码,什么是不含的呀?不含指针只有用数组来做,但是完全无法成为一个双向链表啊,可以说的明白一些吗?
下面就是把一些数据保存在双向链表中,然后打印输出
#include<stdio.h>
#include<stdlib.h>
typedef struct link
{
link *next;
link *pre;
int num;
}link,*Llink;
/*构建链表,长度为num*/
Llink build(int num)
{
int cun=0;
int i=0;
printf("输入要保存的第%d个数据:\n",i+1);
scanf("%d",&cun);
Llink head=(Llink)malloc(sizeof(link));
head->哗指局num=cun;
Llink x=(Llink)malloc(sizeof(link));
x=head;
for(i=1;i<num;i++)
{
printf("输入要保存的第%d个数据:\n",i+1);
scanf("乱让%d",&cun);
Llink y=(Llink)malloc(sizeof(link));
y->num=cun;
x->next=y;
y->pre=x;
x=y;
}
head->pre=x;
x->next=head;
return(head);
}
/*打印头结点为head所指向的节点的链表*/
void output(Llink head)
{
Llink x=(Llink)malloc(sizeof(link));
x=head;
do
{
printf("%d\n",x->num);
x=x->next;
}
while(x!=head);
}
void main()
{
int num;
printf("逗羡输入要保存的数据的个数:\n");
scanf("%d",&num);
Llink head=build(num);
printf("保存的数据为:\n");
output(head);
}
㈤ 用C语言编程实现单链表的基本操作
运行结果如下:
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
char data;
LNode *next;
}* LNodePtr;
LNodePtr CreateList()
{
//初始化头节点
LNodePtr head = (LNodePtr)malloc(sizeof(LNode));
head->data = 0;
head->next = NULL;
LNodePtr tNode;//临时节点
char data;
while(true)
{
scanf("%c",&data);
if(data == '