c語言程序設計鏈表
❶ 如何實現c語言鏈表
鏈表的創建:
#include 「stdlib.h」
#include 「stdio.h」
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num;
float score;
struct student *next;
};
int n;
struct student *creat(void)
{
struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(LEN);
scanf(「%ld,%f」,&p1->num,&p1->score);
head=NULL;
while(p1->num != 0)
{
n=n+1;
if(n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct student *)malloc(LEN);
scanf(「%ld,%f」,&p1->num,&p1->score);
}
p2->next = NULL;
return(head);
}
void main()
{
creat();
}
這樣便可創建鏈表
❷ c語言程序設計——鏈表的應用
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define ID struct id
struct id
{
char name[20];
int num;
int a;
int b;
int c;
double ave;
ID *next; //
};
int pc=0;
ID *creat()
{
ID *p1,*p2,*head;
int pd;
p1=p2=head=NULL;
printf("\t\t\t 開始輸入記錄(學號0結束)!\n");
while(1)
{
printf("請輸入學生的學號:\n");scanf("%d",&pd);
if(pd==0) break;
p1=(ID*)malloc(sizeof(ID));
p1->num=pd;
printf("請輸入學生的姓名:\n");scanf("%s",p1->name);
printf("請輸入學生的語文成績:\n");scanf("%d",&p1->a);
printf("請輸入學生的數學成績:\n");scanf("%d",&p1->b);
printf("請輸入學生的外語成績:\n");scanf("%d",&p1->c);
p1->ave=(p1->a+p1->b+p1->c)/3.0;
if(head==NULL)
{
head=p1;
p2=p1;
}
else
{
p2->next=p1;
p2=p1;
}
pc++;
}
p2->next=NULL;
return(head);
}
ID *sort(ID *head)
{
int temp;
char str[100];
double dbl;
ID *p1,*p2;
for(p1=head;p1!=NULL;p1=p1->next)
{
for(p2=p1->next;p2!=NULL;p2=p2->next)
{
if(p1->ave<p2->ave)
{
temp=p1->num;
p1->num=p2->num;
p2->num=temp;
strcpy(str,p1->name);
strcpy(p1->name,p2->name);
strcpy(p2->name,str);
temp=p1->a;
p1->a=p2->a;
p2->a=temp;
temp=p1->b;
p1->b=p2->b;
p2->b=temp;
temp=p1->c;
p1->c=p2->c;
p2->c=temp;
dbl=p1->ave;
p1->ave=p2->ave;
p2->ave=dbl;
}
}
}
printf("排序成功!!!\n");
return (head);
}
/*輸入/添加記錄*/
ID *insert(ID *head)
{
ID *temp,*p1,*p2;
printf("插入操作開始!!!\n");
temp=(ID *)malloc(sizeof(ID));
printf("請輸入學生的學號:\n");scanf("%d",&temp->num);
printf("請輸入學生的姓名:\n");scanf("%s",temp->name);
printf("請輸入學生的語文成績:\n");scanf("%d",&temp->a);
printf("請輸入學生的數學成績:\n");scanf("%d",&temp->b);
printf("請輸入學生的外語成績:\n");scanf("%d",&temp->c);
temp->ave=(temp->a+temp->b+temp->c)/3.0;
if (head==NULL)
{
head=temp;
temp->next=NULL;
}
else
{
p1=head;
while(p1!=NULL && p1->ave > temp->ave)
{
p2=p1;
p1=p1->next;
}
p2->next=temp;
temp->next=p1;
}
printf("插入成功");
pc++;
return (head);
}
/*刪除學生記錄*/
ID *delet(ID *head)
{
ID *p1,*p2;
int num;
printf("請輸入要刪除的學生的學號:");scanf("%d",&num);
p1=head;
if (head==NULL)
{
printf("沒有記錄\n");
goto end;
}
while(num!=p1->num && p1!=NULL)
{
p2=p1;p1=p1->next;
}
if(num==p1->num)
{
if (p1==head)
head=p1->next;
else
p2->next=p1->next;
printf("刪除成功!!!\n");
pc--;
}
end:return head;
}
/*查找學生記錄*/
ID *search(ID *head)
{
ID *p1,*p2;
char str[100];
printf("請輸入要查找的學生的姓名:");scanf("%s",str);
p1=head;
while(strcmp(str,p1->name) && p1!=NULL)
{
p2=p1;p1=p1->next;
}
if(strcmp(str,p1->name)==0)
{
printf("學生的學號:%d\n",p1->num);
printf("學生的姓名:%s\n",p1->name);
printf("學生的語文成績:%d\n",p1->a);
printf("學生的數學成績:%d\n",p1->b);
printf("學生的外語成績:%d\n",p1->c);
printf("學生的平均成績:%.2lf\n",p1->ave);
}
return head;
}
/*顯示結果函數*/
void print(ID *head)
{
ID *p;
p=head;
printf("\t\t\t*****************\n");
printf("顯示結果是:\n");
if(head!=NULL)
do
{
printf("%10d%10s%10d%10d%10d%10.2lf\n",p->num,p->name,p->a,p->b,p->c,p->ave);
p=p->next;
} while(p!=NULL);
}
void main()
{
ID *head=NULL;
int choise;
printf("\t\t\t* * * * C語言課設* * * *\n");
while(1)
{
printf("\t\t 學生信息管理系統\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t 1.輸入\n");
printf("\t\t 2.顯示\n");
printf("\t\t 3.查找\n");
printf("\t\t 4.排序\n");
printf("\t\t 5.插入\n");
printf("\t\t 6.刪除\n");
printf("\t\t 0.退出\n");
printf("\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("請選擇(0-6):");
scanf("%d",&choise);
switch(choise)
{
case 1: head=creat();
break;
case 2: print(head);
break;
case 3: head=search(head);
break;
case 4: head=sort(head);
break;
case 5: head=insert(head);
break;
case 6: head=delet(head);
break;
case 0:
exit(0);
break;
default :printf("輸入錯誤,請重新輸入!\n");
}
}
}
❸ c語言鏈表程序設計
#include<stdio.h>
#include<malloc.h>
typedef
struct
stackNode{
int
data;
struct
stackNode
*
next;
}LinkNode,*
LinkList;
//初始化帶頭節點的單鏈表
void
InitList(LinkList
*
L)
{
*L
=
(LinkList)malloc(sizeof(LinkNode));
(*L)->next
=
NULL;
}
//單鏈表中插入數值
void
InsertList(LinkList
L)
{
LinkNode
*
Node;
LinkNode
*
p
=
L;
LinkNode
*pre
;
Node
=
(LinkNode*)malloc(sizeof(LinkNode));
Node->next
=
NULL;
printf("\n請輸入您要插入的數據:");
scanf("%d",&Node->data);
while(
p
!=
NULL
&&
p->data
<=
Node->data)
{
pre
=
p;
p
=
p->next;
}
Node->next
=
p;
pre->next
=
Node;
printf("\n插入成功!");
}
//刪除單鏈表元素
void
DelList(LinkList
L)
{
LinkNode
*
p
=
L;
LinkNode
*
pre;
int
value;
printf("\n請輸入您要刪除的數據:");
scanf("%d",&value);
while(p
!=
NULL
&&
p->data
!=
value)
{
pre
=
p;
p
=
p->next;
}
if(p
==
NULL)
printf("Did
not
find
%d!\n",value);
else
{
pre->next
=
p->next;
free(p);
printf("\n刪除成功!");
}
}
//列印單鏈表
void
Print(LinkList
L)
{
LinkNode
*p
=
L->next;
while(p
!=
NULL)
{
printf("%-4d",p->data);
p
=
p->next;
}
printf("\n");
}
//菜單
void
menu(LinkList
L)
{
char
ch;
do{
system("cls");
printf("----------------菜單---------------\n");
printf("
1.插入一個節點\n");
printf("
2.刪除一個節點\n");
printf("
3.列印單鏈表\n");
printf("
4.推出程序\n\n");
printf("請輸入您要進行的操作:");
ch
=
getch();
if(ch
>='1'
&&
ch<'5')
{
printf("%c\n",ch);
getch();
switch(ch)
{
case
'1':
InsertList(L);
break;
case
'2':
DelList(L);
break;
case
'3':
Print(L);
break;
case
'4':
return;
}
getch();
}
}while(ch
!=
'4');
}
void
main()
{
LinkList
L;
InitList(&L);
menu(L);
}
❹ 用C語言實現建立一個單鏈表的過程,並實現列印鏈表中每一個元素,寫出完整程序
這是個很簡單的鏈表創建和輸出
#include<stdio.h>
#include<stdlib.h>
typedef struct linkednode
{
char data;
struct linkednode *next;
}node,*link_list;//鏈表節點的結構及重命名
link_list creat()//創建一個鏈表返回類型是鏈表的首地址
{
link_list L;
node *p1,*p2;
char data;
L=(node*)malloc(sizeof(node));//開辟存儲空間
p2=L;
while((data=getchar())!=' ')//輸入回車鍵時結束輸入
{
p1=(node*)malloc(sizeof(node));
p1->data=data;
p2->next=p1;
p2=p1;
}
p2->next=NULL;
return L;
}
void print(link_list L)//把鏈表輸出
{
node *p;
p=L->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf(" ");
}
void main()
{
link_list L=NULL;
char x;
printf("請輸入鏈表節點: ");
L=creat();
print(L);
}
❺ 用c語言創建鏈表
主函數這里
LinklistList;
printf("輸入創建鏈表的長度:");
scanf("%d",&num);
CreateList_H(List,num); //創建鏈表
改為
LNodeList;
printf("輸入創建鏈表的長度:");
scanf("%d",&num);
CreateList_H(&List,num); //創建鏈表
函數內在堆上分配好內存,但是 沒有傳遞到棧上
另外你的變數名很迷人
❻ c語言編程問題 鏈表
鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。
鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。
每個結點包括兩個部分:
1、存儲數據元素的數據域;
2、存儲下一個結點地址的指針域。
在C語言中,鏈表的構建是通過結構體實現的,一個結構體變數,形成一個鏈表的節點。
在結構體內,需要由至少一個類型為結構體本身類型的指針的元素,作為指針域存在,用來指向下一個或者上一個(僅用於雙向鏈表)元素節點。
❼ C語言程序設計對鏈表的綜合操作
你只是給了
主函數
,其他函數都沒有給,
結構體
的內容也沒有給,如果是
鏈表
的話,是把插入的數據向新建的結點復制後往
頭結點
後面接,應該不存在沖掉,除非你的insert操作是直接把stu這個結點接在head後面,那就相當於給head的next域重復賦值,那就沖掉了,
感覺你
這里說的插入就是給head後面一個結點的next賦stu的值,而不是新建一個結點,因此就沖掉了
❽ 用C語言編寫一個鏈表
看完你下面的追問 其實 意思是
讓你把一個已有的 單鏈表
變成反向的單鏈表 對吧
❾ 如何用C語言編寫一個鏈表
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct Node
{
int data;//數據域
struct Node * next;//指針域
};
/*************************************************************************************
*函數名稱:Create
*函數功能:創建鏈表.
*輸入:各節點的data
*返回值:指針head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函數名稱:insert
*函數功能:在鏈表中插入元素.
*輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容
*返回值:無
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函數名稱:del
*函數功能:刪除鏈表中的元素
*輸入:head 鏈表頭指針,p 被刪除元素位置
*返回值:被刪除元素中的數據域.如果刪除失敗返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函數名稱:print
*函數功能:列印鏈表中的元素
*輸入:head 鏈表頭指針
*返回值:無
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函數名稱:main
*函數功能:主函數創建鏈表並列印鏈表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}
❿ 使用C語言創建一個動態鏈表
可以用頭插法或尾插法
(下面用尾插法)
思想為:讓你輸入一串字元串,為每個字元創建一個節點,添加到鏈表的後面.直到輸入的字元為@為止.
#include<stdio.h>
#include<malloc.h>
typedefchardatatype;
typedefstructnode
{
datatypedata;
structnode*next;
}linklist;
linklist*p,*q,*head;
main()
{
charc;
head=(linklist*)malloc(sizeof(linklist));
head->next=null;
p=head;
c=getchar();
while(c!='@')
{
q=(linklist*)malloc(sizeof(linklist));
q->data=c;
q->next=null;
p->next=q;
p=p->next;
c=getchar();
}
}
可以在main()最後加上
for(p=head->next;p!=null;p=p->next)
{
printf("%5c",p->data);
}
來測試結果,本人已經tc2.0下面測試通過.