Ⅰ c語言數據結構單鏈表初始化
你說的那個是逆序建立n個節點的鏈表,建完頭結點後由於鏈表中沒有其他節點就把頭結點的next置為空,這一點如果不明白的話去看鏈表那一章,有介紹!!!
之後從後往前建立鏈表!!剛開始是L->next=NULL
要注意p是每次新建的節點,這樣從後往前以此建立鏈表,只要明白p是每次新建的節點,和從後往前建立,就會明白的!!給你花了張圖!!
Ⅱ c語言單鏈表初始化問題
這里q是什麼,q是形參,你無論怎麼變q,出了函數傳進來的值還是不變。假如Node是一個int,你傳入一個int* q,你要改變q是不是用*q=0;
一樣的,在這個例子里,我會傳入一個Node** q ,然後所有q改成*q 來實現。
表達能力不行,反正就那意思吧。應該沒錯,嗯。
Ⅲ c語言數據結構單鏈表的初始化 插入 銷毀 元素的取出 刪除 操作 求詳細C源代碼 謝謝。。。。
單鏈表功能大全,嘿嘿
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int nDate;
struct node *pstnext;
}Node;
//鏈表輸出
void output(Node *head)
{
Node *p = head->pstnext;
while(NULL != p)
{
printf("%d ", p->nDate);
p = p->pstnext;
}
printf("\r\n");
}
//鏈表建立
Node* creat()
{
Node *head = NULL, *p = NULL, *s = NULL;
int Date = 0, cycle = 1;
head = (Node*)malloc(sizeof(Node));
if(NULL == head)
{
printf("分配內存失敗\r\n");
return NULL;
}
head->pstnext = NULL;
p = head;
while(cycle)
{
printf("請輸入數據且當輸入數據為0時結束輸入\r\n");
scanf("%d", &Date);
if(0 != Date)
{
s = (Node*)malloc(sizeof(Node));
if(NULL == s)
{
printf("分配內存失敗\r\n");
return NULL;
}
s->nDate = Date;
p->pstnext = s;
p = s;
}
else
{
cycle = 0;
}
}
p->pstnext = NULL;
return(head);
}
//單鏈表測長
void length(Node *head)
{
Node *p = head->pstnext;
int j=0;
while(NULL != p)
{
p = p->pstnext;
j++;
}
printf("%d\r\n", j);
}
//鏈表按值查找
void research_Date(Node *head, int date)
{
Node *p;
int n=1;
p = head->pstnext;
while(NULL != p && date != p->nDate)
{
p = p->pstnext;
++n;
}
if(NULL == p)
{
printf("鏈表中沒有找到該值");
}else if(date == p->nDate)
{
printf("要查找的值%d在鏈表中第%d個位置\r\n", date, n);
}
return;
}
//按序號查找
void research_Number(Node *head, int Num)
{
Node *p=head;
int i = 0;
while(NULL != p && i < Num)
{
p = p->pstnext;
i++;
}
if(p == NULL)
{
printf("查找位置不合法\r\n");
}else if(i == 0)
{
printf("查找位置為頭結點\r\n");
}else if(i == Num)
{
printf("第%d個位置數據為%d\r\n", i, p->nDate);
}
}
//在指定元素之前插入新結點
void insert_1(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre && j < i-1)
{
pre = pre->pstnext;
j++;
}
if(NULL == pre || j > i-1)
{
printf("插入位置不存在\r\n");
}else
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配內存失敗\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}
}
//在指定元素之後插入新結點
void insert_2(Node *head, int i, int Newdate)
{
Node *pre = head, *New = NULL;
int j = 0;
while(NULL != pre->pstnext && j < i)
{
pre = pre->pstnext;
j++;
}
if(j == i)
{
New = (Node*)malloc(sizeof(Node));
if(NULL == New)
{
printf("分配內存失敗\r\n");
return;
}
New->nDate = Newdate;
New->pstnext = pre->pstnext;
pre->pstnext = New;
}else
{
printf("插入位置不存在\r\n");
}
}
//刪除指定結點
void Delete_1(Node *head, int i3)
{
Node *p = head, *pre = NULL;
int j = 0;
while(NULL != p && j < i3)
{
pre = p;
p = p->pstnext;
j++;
}
if(NULL == p)
{
printf("刪除位置不存在\r\n");
}else
{
pre->pstnext = p->pstnext;
free(p);
}
}
//指定刪除單鏈表中某個數據,並統計刪除此數據的個數
int Delete_2(Node *head, int Delete_date)
{
int count = 0;
Node *p = head, *q;
while(NULL != p->pstnext)
{
q = p->pstnext;
if(q->nDate == Delete_date)
{
p->pstnext = q->pstnext;
free(q);
++count;
}
else
{
p = q;
}
}
return count;
}
//鏈表逆置
void Reverse_list(Node *head)
{
Node *q, *s;
if(NULL == head->pstnext || NULL == head->pstnext->pstnext)
{
return;
}
q = head->pstnext->pstnext;
head->pstnext->pstnext = NULL;
while(NULL != q)
{
s = q->pstnext;
q->pstnext = head->pstnext;
head->pstnext = q;
q = s;
}
}
//單鏈表的連接
void connect_list(Node *head, Node *head_New)
{
Node *p = head;
while(NULL != p->pstnext)
{
p = p->pstnext;
}
p->pstnext = head_New->pstnext;
}
//單鏈表銷毀
void destroy_list(Node* head)
{
while (NULL != head)
{
Node* temp = head;
head = head->pstnext;
free(temp);
}
}
void main()
{
int date, num; //待查找數據
int i3; //指定刪除元素的位置
int i1, i2, Newdate_1, Newdate_2; //待插入的新數據
int Delete_date, k; //待刪除的數據與其個數
Node *Head = NULL; //定義頭結點
Node *Head_New = NULL;
//鏈表建立
Head = creat();
printf("輸出建立的單鏈表\r\n");
output(Head);
//單鏈表測長
printf("單鏈表長度為\r\n");
length(Head);
//鏈表按值查找
printf("請輸入待查找的數據\r\n");
scanf("%d", &date);
research_Date(Head, date);
//鏈表按序號查找
printf("請輸入待查找序號\r\n");
scanf("%d", &num);
research_Number(Head, num);
//在指定第i1個元素之前插入新元素Newdate
printf("在指定第i個元素之前插入新元素Newdate");
printf("請輸入i與元素且以逗號間隔\r\n");
scanf("%d,%d", &i1, &Newdate_1);
insert_1(Head, i1, Newdate_1);
printf("插入後新鏈表\r\n");
output(Head);
//在指定第i2個元素之後插入新元素Newdate
printf("在指定第i個元素之後插入新元素Newdate");
printf("請輸入i與元素且以逗號間隔\r\n");
scanf("%d,%d", &i2, &Newdate_2);
insert_2(Head, i2, Newdate_2);
printf("插入後新鏈表\r\n");
output(Head);
//指定刪除i3元素
printf("刪除元素的位置\r\n");
scanf("%d", &i3);
Delete_1(Head, i3);
printf("刪除後新鏈表\r\n");
output(Head);
//指定刪除單鏈表中某個數據,並統計刪除此數據的個數
printf("請輸入待刪除的元素\r\n");
scanf("%d", &Delete_date);
k = Delete_2(Head, Delete_date);
printf("刪除後新鏈表\r\n");
output(Head);
printf("刪除指定元素在鏈表中的個數為:");
printf("%d\r\n", k);
//單鏈表逆置
Reverse_list(Head);
printf("逆置後輸出\r\n");
output(Head);
//單鏈表的連接
printf("建立一個新鏈表\r\n");
Head_New = creat();
printf("輸出新鏈表");
output(Head);
printf("將新鏈表連接到原來鏈表的尾部並輸出\r\n");
connect_list(Head, Head_New);
output(Head);
destroy_list(Head);
return;
}
Ⅳ 大俠們怎麼用C語言實現初始化一個鏈表啊~~~~~~~~~~
單鏈表:
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
char data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L) //初始化
{
*L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
}
char GetElem(LinkList L,int i) //返回i 位置的元素
{
//L為帶頭結點的單鏈表的頭指針。
LinkList p;
int j;
p = L->next; j = 1; //初始化,p指向第一個結點,j為計數器
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i) exit(1); //i位置元素不存在
return(p->data);
}
void ListInsert(LinkList *L,int i,char e)//插入
{
//在帶頭結點的單鏈線性表L中第i個位置前插入元素e
LinkList p,s;
int j;
p = *L; j = 0;
while(p && j<i-1)//尋找第i-1個結點
{
p = p->next;
++j;
}
if(!p || j>i-1) exit(1); //i位置不正確
s = (LinkList)malloc(sizeof(LNode)); //新結點
s->data = e;
s->next = p->next;
p->next = s;
}
void ListDelete(LinkList *L,int i)//刪除i位置元素
{
LinkList p,q;
int j;
p = *L; j = 0;
while(p->next && j<i-1)//尋找第i個結點
{//這以p->next開始是為了避開頭結點,頭結點不可刪除
//而且這樣是必須的,這樣是為了有被刪除點前面結點的地址,這樣才能有前繼結點,連接刪除點的後繼結點.
p = p->next;
++j;
}
if(!(p->next) || j>i-1) exit(1); //刪除位置不合理
q = p->next; //刪除該點
p->next = q->next;
free(q);
}
void CreateList(LinkList *L,int n)
{
//逆位序輸入n個元素的值,建立帶表頭結點的單鏈線性表L
int i;
LinkList p;
(*L) = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL; //先建立帶頭結點的單鏈表
for(i=n;i>0;--i)
{
p = (LinkList)malloc(sizeof(LNode)); //生成新結點
scanf("%c",&p->data);
fflush(stdin);
p->next = (*L)->next;
(*L)->next = p;
}
//*****************另一插入法**************************
q = *L = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
for(i=n;i>0;--i)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%c",&p->data);
fflush(stdin);
p->next = NULL;
q->next = p;
q = p;
//q->next = p;
}
//***********************************************************
}
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)
{
//鏈表La,Lb按遞增排列
LinkList pa,pb,pc;
pa = (*La)->next;
pb = (*Lb)->next;
(*Lc) = pc = (*La);
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa?pa:pb; //插入剩餘段
//free(Lb); //釋放Lb頭結點
}
void display(LinkList *L)
{
LinkList di;
di = (*L)->next;
while(di!=NULL)
{
printf("%c\t",di->data);
di = di->next;
}
printf("\n");
}
void main()
{
LinkList link,link2,link3;
InitList(&link);
InitList(&link2);
CreateList(&link,5);
CreateList(&link2,5);
display(&link);
display(&link2);
MergeList(&link,&link2,&link3);
display(&link3);
}
Ⅳ c語言鏈表初始化中
p = head->next;??這個怎麼理解
本來head->next = NULL;
現在 p = NULL?何意?
16行報錯 8成是你的類型定義的有問題
typedef struct _node
{
struct _node *pPri;
struct _node *pNext;
int a;
}sNode,*psNode;
Ⅵ 怎麼用C語言初始化一個鏈表啊~
所謂初始化鏈表就是把鏈表的數據置空,也就是所有的數據,指針都為null
舉個單鏈表的例子
該演算法的結果將單鏈表head置為空表,只需要將頭節點的指針置為null即可。演算法實現如下
void setnull(struct Lnode *head)
{
head->next=NULL;
}
雙鏈表和循環鏈表依次類推·
Ⅶ C語言初始化單鏈表!
在單鏈表A中刪除所有和單鏈表B中元素相同的結點
#include
"stdafx.h"
#include
<stdio.h>
#include
<malloc.h>
#define
SIZE
sizeof(struct
node)
struct
node{
int
data;
struct
node
*next;
};
void
init(struct
node
*LC){
int
n;
struct
node
*Str,*p;
p=(struct
node
*)malloc(SIZE);
Str=LC;
printf("請輸入鏈表A,以小於零的數結束輸入:\n");
scanf("%d",&n);
while(n>=0){
p->data=n;
Str->next=p;
Str=p;
p=(struct
node
*)malloc(SIZE);
scanf("%d",&n);
Str->next=NULL;
}
printf("您輸入的序列的是:\n");
for
(Str=LC->next;Str!=NULL;){
printf("%d
",Str->data);
Str=Str->next;
}
printf("\n");
}
void
delet_LA(struct
node
*LA,struct
node
*pa){
struct
node
*p;
struct
node
*q;
p=LA;
q=p;
for
(p;p!=pa;){
q=p;
p=p->next;
}
q->next=pa->next;
}
void
delete_same(struct
node
*LA,struct
node
*LB){
struct
node
*pa,*pb;
pa=LA->next;
pb=LB->next;
for
(pb;pb!=NULL;){
for
(pa;pa!=NULL;){
if
(pb->data==pa->data){
delet_LA(LA,pa);
pa=LA->next;
}
else{
pa=pa->next;
}
}
pb=pb->next;
pa=LA->next;
}
printf("處理後的單鏈表A為:\n");
for
(pa=LA->next;pa!=NULL;){
printf("%d
",pa->data);
pa=pa->next;
}
}
void
main(){
struct
node
*LA;
struct
node
*LB;
LA=(struct
node
*)malloc(SIZE);
if(LA!=NULL)
LA->data=-1;
LB=(struct
node
*)malloc(SIZE);
if(LB!=NULL)
LB->data=-1;
init(LA);
init(LB);
delete_same(LA,LB);
}
Ⅷ c語言,單鏈表,這個p不是初始化了嗎怎麼改
#include<stdio.h>
#include<stdlib.h>
typedefintElemType;
typedefstructnode{
ElemTypedata;
structnode*next;
}*LinkList,*pNode,NODE;
LinkListCreatList(){
pNodep,head;
ElemTypee;
head=p=(pNode)malloc(sizeof(NODE));
while(scanf("%d",&e)==1&&e){
p->next=(pNode)malloc(sizeof(NODE));
p->next->data=e;
p=p->next;
}
p->next=NULL;
returnhead;
}
voidShowList(LinkListhead){
pNodep=head->next;
while(p){
printf("%d",p->data);
p=p->next;
}
printf("
");
}
intmain(){
LinkListhead=CreatList();
if(head)ShowList(head);
return0;
}
Ⅸ 求用c語言初始化一個單鏈表,然後插入刪除的源代碼
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
typedef struct Node
{
int date; //數據域
struct Node * pNext; //指針域
}NODE,*PNODE;
PNODE create_list(void); //創建鏈表
void traverse_list(PNODE); //遍歷鏈表
bool is_empty(PNODE); //鏈表是否為空
int list_len(PNODE); //求鏈表長度
bool insert_list(PNODE,int , int ); //插入鏈表結點
bool del_list(PNODE, int, int *); //刪除鏈表結點
void sort_list(PNODE); //排序
int main(void)
{
int len;
int dval = 0;
PNODE pHead = NULL;
pHead = create_list();
// insert_list(pHead, 3, 26);
traverse_list(pHead);
del_list(pHead,2,&dval);
printf("刪除的值是:%d\n",dval);
// sort_list(pHead);
traverse_list(pHead);
if ( is_empty(pHead) )
{
printf("鏈表是空的!\n");
}
len = list_len(pHead);
printf("鏈表的長度是:%d\n",len);
return 0;
}
PNODE create_list(void)
{
int i;
int len;
int val;
PNODE pHead = (PNODE)malloc(sizeof(NODE)); //創建頭結點
if (NULL == pHead)
{
printf("鏈表創建失敗!\n");
exit(-1);
}
PNODE pTail = pHead; //創建尾結點
pTail->pNext = NULL;
printf("請輸入要創建的鏈表: ");
scanf("%d",&len);
for (i=0; i<len; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("鏈表創建失敗,可能原因:內存不足!\n");
exit(-1);
}
printf("請輸入第%d個的值: ",i+1);
scanf("%d",&val);
pNew->date = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
}
void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while ( NULL != p)
{
printf("%d ",p->date);
p = p->pNext;
}
printf("\n");
return ;
}
bool is_empty(PNODE pHead)
{
if ( NULL == pHead->pNext )
{
return true;
}else
{
return false;
}
}
int list_len(PNODE pHead)
{
int len = 0;
PNODE p = pHead->pNext;
while ( NULL != p )
{
len++;
p = p->pNext;
}
return len;
}
bool insert_list(PNODE pHead, int place, int val) //我自己的:
{ /*
int len = list_len(pHead);
int i;
if ( place > len)
{
printf("Error!\n");
return false;
// exit(-1);
}
PNODE p = (PNODE)malloc(sizeof(NODE));
PNODE prev;
if (NULL == p)
{
printf("內存分配失敗!\n");
return false;
// exit(-1);
}
p->date = val;
PNODE temp = pHead;
for (i=0; i<place; i++)
{
prev = temp;
temp = temp->pNext;
}
p->pNext = temp;
prev->pNext = p;
*/
// 傳說中,一個牛人的經典演算法:
int i = 0;
PNODE p = pHead;
while (NULL != p && i < place-1)
{
p = p->pNext;
i++;
}
if (i > place-1 || NULL == p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("分配失敗了!\n");
return false;
}
pNew->date = val;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
}
bool del_list(PNODE pHead, int place, int * pval)
{ /* 我自己的演算法:
int len = list_len(pHead);
int i;
if (place > len)
{
printf("Error! 下標越界!\n");
return -1;
}
PNODE pTem;
PNODE temp = pHead;
PNODE prev;
for (i=0; i<place; i++)
{
prev = temp;
temp = temp->pNext;
}
prev->pNext = temp->pNext;
pTem = temp;
* pval = temp->date;
free(pTem);
*/
// 牛人優化的代碼
int i = 0;
PNODE p = pHead;
while ( NULL != p->pNext && i < place - 1 )
{
p = p->pNext;
i++;
}
if ( NULL == p->pNext || i >= place - 1)
{
printf("ERROR! 刪除錯誤!!\n");
return false;
}
PNODE pLast = (PNODE)malloc(sizeof(NODE));
pLast = p->pNext;
*pval = pLast->date;
p->pNext = pLast->pNext;
free(pLast);
return true;
}
void sort_list(PNODE pHead)
{
int i,j=0,t;
int len = list_len(pHead);
PNODE a; //指向首節點
PNODE b ; //指向首節點後的位置
// PNODE t = (PNODE)malloc(sizeof(NODE));
for (i=0,a = pHead->pNext; i<len-1; i++, a = a->pNext)
{
for (j=0, b = a->pNext; j<len-i-1; j++,b = b->pNext)
{
if ( a->date < b->date )
{
t = a->date;
a->date = b->date;
b->date = t;
}
}
}
return ;
}
Ⅹ C語言初始化單鏈表!
定義單鏈表就是可以不用頭指針,你的想法是對的!