❶ 下面是用c語言編寫的對不帶頭結點的單鏈表進行就地逆置的演算法,求大神詳細解釋
voidreverse(linklist&L)
{
linklistp=NULL,q=L;
while(q!=NULL){
L=q->next;//保留下一個節點
q->next=p;
p=q;
q=L;//移動到下一個節點
}
L=p;//指向逆置後的頭節點
}
❷ C語言鏈表的使用方法
D
答案D設置完,p就從鏈表中丟掉了。
p就是一個指向結構體node的指針。
p->next就是p包含的執行下一個node的指針,在本題,就是q。
❸ 設計鏈表合並演算法,將兩個已排序(升序)的單鏈表,合並成一個鏈表而不改變其有序性。用c語言編寫。
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *next;
}List;
List *create(List *head,int n)//創建鏈表
{
List *p,*q;
q=(List *)malloc(sizeof(List));
q->data=n;
q->next=NULL;
p=head;
while(p->next!=NULL)p=p->next;
p->next=q;
return head;
}
void print(List *head)//輸出鏈表
{
List *p;
p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
List *LINK(List *head1,List *head2)//連接鏈表
{
List *p;
p=head1;
while(p->next!=NULL)p=p->next;
p->next=head2->next;
return head1;
}
main()
{
int i;
List *head1,*head2,*link1;
head1=(List *)malloc(sizeof(List));
head1->next=NULL;
head2=(List *)malloc(sizeof(List));
head2->next=NULL;
for(i=1;i<=5;i++)head1=create(head1,i);//輸入鏈表1
printf("鏈表1:\n");
print(head1);
printf("\n鏈表2:\n");
for(i=6;i<=10;i++)head2=create(head2,i);//輸入鏈表2
print(head2);
link1=LINK(head1,head2);
printf("\n連接後的鏈表:\n");
print(link1);
}
❹ 用C語言編寫程序建立鏈表結構體類型實現鏈表初始化遍歷和插入演算法
#include <stdio.h>
#include <stdlib.h>
#define telemtype char
#define ok 1
#define error 0
#define overflow -1
typedef int status;
typedef struct bitnode
{
telemtype data;
struct bitnode *lchild,*rchild;
}bitnode,*bitree;
void preordertraverse(bitree T)
{
if(T)
{
printf("%c ",T->data);
preordertraverse(T->lchild);
preordertraverse(T->rchild);
}
}
status createbitree(bitree &T)
{
int ch;
ch=getchar();
if(ch==' ')
T=NULL;
else
{
if(!(T=(bitnode*)malloc(sizeof(bitnode))))
exit(overflow);
T->data=ch;
createbitree(T->lchild);
createbitree(T->rchild);
}
return ok;
}
void prinbtree(bitree T)
{
if(T!= NULL)
{
printf("%c", T->data);
if(T->lchild!=NULL||T->rchild!=NULL)
{
printf("(");
prinbtree(T->lchild);
if(T->rchild!=NULL)
{
printf(",");
}
prinbtree(T->rchild);
printf(")");
}
}
}
int main()
{
bitree T=NULL;
printf("先序輸入二叉樹:\n");
createbitree(T);
printf("先序遍歷二叉樹為:\n");
preordertraverse(T);
printf("\n");
prinbtree(T);
printf("\n");
return 0;
}
我寫的,希望對你有用!
❺ C語言,已知線性表中的元素以值遞增有序排列,並以單鏈表作存儲結構,高效演算法怎麼算
一個功缺辯能函數:
#include<stdio.h>
#include<stdlib.h>
typedefstructlist{
intdata;
structlist*next;
}list;
voidfun(list*head,intmink,intmaxk){
list*pre,*p;
pre=head;
p=pre->next;
while(p){
if(p->data>mink&&p->data<maxk){
pre->next=p->next;
p=pre->next;
}
else{
pre=pre->next;
p=pre->next;
}
}
}
❻ 如何用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}