㈠ 用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 == '