當前位置:首頁 » 編程語言 » c語言創建有序鏈表
擴展閱讀
雲服務相片存儲 2023-02-08 22:12:49
sql建表文件夾 2023-02-08 21:49:50

c語言創建有序鏈表

發布時間: 2022-11-30 14:08:06

Ⅰ 用c語言寫一個有序鏈表,鏈表類型為字元串.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct _Node {
int data;
struct _Node *next;
};

typedef struct _Node Node;

// 交換兩個結點的數據
void SwapNodeData(Node *p1, Node *p2) {
int temp = p1->data;
p1->data = p2->data;
p2->data= temp;
}

// 冒泡排序對鏈表進行排序
void BubbleSort(Node *head) {
Node *pTemp;
int maxIdx, idx;
// 計算鏈表長度
maxIdx = 0;
for (pTemp = head; pTemp != NULL; pTemp = pTemp->next)
++maxIdx;
idx = 0;
while (idx < maxIdx-1) {
for (pTemp = head; idx < maxIdx-1; pTemp = pTemp->next, ++idx) {
if (pTemp->data > pTemp->next->data)
SwapNodeData(pTemp, pTemp->next);
}
idx = 0;
--maxIdx;
}
}

int main(void)
{
Node *head = NULL, *temp = NULL, *p = NULL;
int i;

srand((unsigned int)time(NULL));
// 產生隨機數鏈表
head = (Node *)malloc(sizeof(Node));
head->data = rand() % 40;
p = head;
for (i = 1; i < 20; ++i) {
temp = (Node *)malloc(sizeof(Node));
temp->data = rand() % 40;
p->next = temp;
p = p->next;
}
p->next = NULL;
// 輸出隨機數鏈表
for (p = head; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
// 對鏈表排序
BubbleSort(head);
// 輸出以排序的鏈表
for (p = head; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
// 釋放資源
for (p = head->next; p != NULL; p = p->next) {
free(head);
head = p;
}
free(head);
head = NULL;
getchar();
return 0;
}

Ⅱ c語言採用頭插法或尾插法建立鏈表,從鍵盤輸入遞增有序的數據建立鏈表

#include<stdio.h>
#include<stdlib.h>
/*定義鏈表結點*/
typedefstructst_node{
intvalue;
structst_node*next;
}node_t;
/*定義鏈表*/
typedefstruct{
node_thead;
node_t*tail;
}list_t;
/*插入到隊列尾部*/
voidlist_push_back(list_t*l,intvalue){
node_t*t=(node_t*)malloc(sizeof(node_t));
t->value=value;
t->next=NULL;

l->tail->next=t;
l->tail=t;
}
/*有序地插入元素*/
voidlist_push_sort(list_t*l,intvalue){
/*找出小於或等於value的節點,插入到該節點前面*/
node_t*p=l->head.next,*last=&l->head,*t;
for(;p;last=p,p=p->next){
if(value<=p->value){
t=(node_t*)malloc(sizeof(node_t));
t->value=value;
t->next=p;

last->next=t;
return;
}
}
/*如果沒有小於或等於value的節點,則直接插入到末尾*/
list_push_back(l,value);
}
/*使用數組初始化有序鏈表*/
voidlist_init(list_t*l,int*p,ints){
inti=0;
l->head.next=NULL;
l->tail=&l->head;
for(;i<s;++i){
list_push_sort(l,p[i]);
}
}
/*清空鏈表*/
voidlist_clear(list_t*l){
node_t*p=l->head.next,*t;
while(p){
t=p;
p=p->next;
free(t);
}
l->head.next=NULL;
l->tail=&l->head;
}
/*合並有序鏈表*/
voidlist_merge(list_t*l,list_t*r,list_t*o){
node_t*pl=l->head.next,*pr=r->head.next;
while(pl||pr){
if(pl&&pr){
if(pl->value<=pr->value){
list_push_back(o,pl->value);
pl=pl->next;
}else{
list_push_back(o,pr->value);
pr=pr->next;
}
}elseif(pl){
list_push_back(o,pl->value);
pl=pl->next;
}else{
list_push_back(o,pr->value);
pr=pr->next;
}
}
}
/*刪除相同結點*/
voidlist_plicate_delete(list_t*l){
if(&l->head!=l->tail){
node_t*p=l->head.next,*last,*t;
intvalue=p->value;

last=p;
p=p->next;
while(p){
if(value==p->value){
t=p;
last->next=p->next;
p=p->next;
free(t);
}else{
value=p->value;
last=p;
p=p->next;
}
}
}
}
/*列印鏈表*/
voidlist_show(char*name,list_t*l){
node_t*p=l->head.next;
printf("%s:",name);
for(;p;p=p->next){
printf("%d,",p->value);
}
printf(" ");
}
/*主函數*/
voidmain(){
list_tlist1,list2,list3;
inta[]={10,4,6,12,1,8,14,10,14,6};
intb[]={7,11,6,1,13,5,1,14};

/*所有鏈表需要初始化後才能使用*/
list_init(&list1,a,sizeof(a)/sizeof(int));
list_init(&list2,b,sizeof(b)/sizeof(int));
list_init(&list3,NULL,0);

printf("初始值: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*合並鏈表*/
list_merge(&list1,&list2,&list3);
printf("合並後: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*去重復*/
list_plicate_delete(&list3);
printf("去重復後: ");
list_show("List1",&list1);
list_show("List2",&list2);
list_show("List3",&list3);

/*所有鏈表都需要釋放空間*/
list_clear(&list1);
list_clear(&list2);
list_clear(&list3);
}

//這可是血汗錢啊.....

Ⅲ 用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語言編寫一個演算法,實現有序鏈表的插入。鏈表有序且不允許有重復元素

如代碼所示,c++語言,設帶頭節點的單鏈表L是一個遞增有序表,試寫一個函數,將x插入L中,並使L仍是一個有序表。望採納!

Ⅳ c語言採用頭插法或尾插法建立鏈表,從鍵盤輸入遞增有序的數據建立 鏈表

void DeleteRepetedNode(PNode head)
{
int a[100]={0};
int i = 0,j;
int flag = 1;
PNode p,q,pre;
pre = head;
p = pre->next;
q = p->next;
while(p)
{
a[i++] = pre->data;
for(j=0;j<i;j++)
if(a[j]==p->data)
{
pre->next = q;
free(p);
p = q;
flag = 0;
break;
}
if(flag)
pre = p;
if(q&&p)
{
p = q;
q = q->next;
}
flag = 1;
}
}

Ⅵ 用c語言實現一個有序單鏈表

不多說,直接看代碼:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
typedefstructyinshu{
unsignedintyz;
structyinshu*next;
}YSNode,*YinShu;//定義鏈表節點類型YSNode,和指針YinShu

voidInsertNode(unsignedintn,YinShu&L){
//在L鏈表的第一個節點之後插入一個節點,值為n
YinShup;
p=(YinShu)malloc(sizeof(YSNode));//分配節點空間
p->yz=n;
p->next=L->next;
L->next=p;
}

voidYinShuFenJie(unsignedintn,YinShu&L){
//對n進行質因數分解,並存在鏈表L中
unsignedintj,k;
k=(unsignedint)sqrt(n);
for(j=2;j<=k;++j){
if(n%j==0){//遇到一個質因數j
InsertNode(j,L);
n/=j;
k=(unsignedint)sqrt(n);
--j;
}
}
InsertNode(n,L);//插入剩下的質因數n
}

intmain(){
unsignedintn;
YinShuL,p,q;
scanf("%d",&n);
L=(YinShu)malloc(sizeof(YSNode));
L->yz=n;
L->next=NULL;//第一個節點存放n的值
YinShuFenJie(n,L);
p=L->next;q=p->next;
printf("%u=%u",L->yz,p->yz);
free(L);free(p);//釋放第一、二個節點
while(q){
p=q;
printf("*%u",p->yz);
q=p->next;
free(p);
}
printf(" Finished. ");
getch();
return0;
}

希望能幫到你!

Ⅶ c語言創建鏈表

1、你使用了malloc函數但沒有導入頭文件malloc.h。
2、函數DATA *create(int n);沒有申明就直接調用。
(另外main函數中DATA* head;給個初值NULL,避免野指針。)
修改以上內容,親測可運行。

Ⅷ 有序單鏈表的實現 用c語言編程

#include <stdio.h> /*該文件包含pringtf()等函數*/
#define MaxSize 100 /*定義MaxSize為100*/
typedef int DataType;
typedef struct
{
DataType list[MaxSize];
int size;
} SeqList;

/*定義DataType為int*/

void ListInitiate(SeqList *L) /*初始化順序表L*/
{
L->size = 0; /*定義初始數據元素個數*/
}

int ListInsert(SeqList *L, DataType x)
/*在順序表L插入數據元素值x*/
/*插入成功返回1,插入失敗返回0*/
{
int i=0,j;

if(L->size >= MaxSize)
{
printf("順序表已滿無法插入! \n");
return 0;
}

for(i=0;i<L->size;i++)
if (x<L->list[i]) break;

for(j = L->size; j > i; j--) L->list[j] = L->list[j-1]; /*為插入做准備*/
L->list[i] = x; /*插入*/
L->size ++; /*元素個數加1*/
return 1;

}

int ListDelete(SeqList *L, DataType x)
/*刪除順序表L中的數據元素值x*/
/*刪除成功返回1,刪除失敗返回0*/
{ int i, j;
if(L->size <= 0)
{
printf("順序表已空無數據元素可刪! \n");
return 0;
}
for(i = 0; i < L->size; i++)
if(x == L->list[i]) break;

if(i == L->size) return 0;
else
{ for(j = i; j < L->size; j++)
L->list[j] = L->list[j+1];

L->size--; return 1;
}
}

void main(void)
{
SeqList myList;
int i,x;
ListInitiate(&myList); /*初始化*/
printf("請輸入10個數據元素\n");
for(i = 0; i<10; i++)
{
scanf("%d",&x);
if(ListInsert(&myList, x) == 0) /*插入10個數據元素*/
{
printf("錯誤! \n");
return;
}
}

for(i = 0; i < myList.size; i++)
printf("%d ", myList.list[i]);
printf("請輸入要刪除的數據元素\n");
scanf("%d",&x);
if(ListDelete(&myList,x) == 0) /*刪除某個數據元素*/
{
printf("刪除不成功,數據元素可能不存在 \n");
return;
}

printf("刪除後\n");
for(i = 0; i < myList.size; i++)
printf("%d ", myList.list[i]); /*顯示數據元素*/

}

Ⅸ C語言如何創建單鏈表

C語言創建單鏈表如下:

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

#include "iostream.h"

typedef struct node

{

intdata;

node * next;

}node , * List;

void create(int n)

{

int c;

List s,L;

L=(List)malloc(sizeof(node));

L->next=NULL;

printf("請輸入第1個數據:");

scanf("%d",&c);

L->data=c;

for(int i=2;i<=n;i++)

{

s=(List)malloc(sizeof(node));

printf("請輸入第%d個數據:",i);

scanf("%d",&c);

s->data=c;

s->next=L;

L->next =s;

}

printf("鏈表創建成功!");

}

void main()

{

int n;

printf("請你輸入鏈表的個數:");

scanf("%d",&n);

create(n);

}