如何用C语言写一个单链表

Kenny田 2006-07-27 09:41:11
设有一个有序的线性单链表,其结点值均为整数,且按大到小链接。试编写一个算法,向该线性单链表中插入一个整数,使线性单链表仍然是有序的!

现在要求用C语言写一个出来,急着用,请各位好心人帮我写一个出来,谢谢!
...全文
739 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lockhall 2007-01-23
  • 打赏
  • 举报
回复
mark
Kenny田 2006-07-31
  • 打赏
  • 举报
回复
谢谢各位,分不多,请多多包涵,嘿嘿!
chenhu_doc 2006-07-27
  • 打赏
  • 举报
回复
input the char you want ( a, b ):::
a
input the char you want ( a, b ):::
b
first, add char you want::(e,f,x,y....)
c
d
e
f
g
h
#
second, while char you want to find
b
b is found in this link..
second, while char you want to delete
f
element in the list is:
h
g
e
d
c
a
b
Press any key to continue
//测试结果。。。。。
chenhu_doc 2006-07-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct Node
{
char ch;
struct Node *next;
}LNode;


void add( LNode ** head )
{
char inputchar ;
scanf("%c",&inputchar);
getchar();

while( inputchar != '#') //当输入为 # 的时候停止输入
{
LNode *p= (LNode *)malloc(sizeof(LNode));
p->ch = inputchar;

p->next = (*head)->next;
(*head)->next = p;

scanf("%c",&inputchar);
getchar();
}
}

char find( LNode **head, char arg )
{
LNode *p = (*head);
while( p != NULL )
{
if( p->ch == arg)
return p->ch;
else
p = p->next;
}
return '#';
}

void del( LNode **head, char arg )
{
LNode *p = (*head)->next;

while( p->next != NULL )
{
if( p->next->ch == arg)
break;
else
p = p->next;
}

if( p->next == NULL )
{
printf("the char you want to delete doesn't esit in list...\n");
return;
}
else if( p->next->next == NULL )
{
p->next = NULL;
}
else
{
p->next = p->next->next;
}
}

void print( LNode **head )
{
LNode *p = (*head)->next;
while( p != NULL )
{
printf( "%c\n", p->ch );
p = p->next;
}
}

void main()
{
LNode *head = (LNode *)malloc(sizeof(LNode));
LNode *p = head;
char arg;
char re;
int i;
int LEN = 2;
for( i = 0; i<LEN; i++ ) //先在结构中添入几个数据,为2;
{
LNode *node = (LNode *)malloc(sizeof(LNode));
printf("input the char you want ( a, b )::: \n");
scanf("%c",&node->ch);
p->next = node;
p=node;
getchar();
}
p->next = NULL;

printf("first, add char you want::(e,f,x,y....)\n");
add(&head );

printf("second, while char you want to find\n");
scanf("%c", &arg);
getchar();
re = find( &head, arg );
if( re != arg)
printf(" this arg doesn't exsit...\n");
else
printf("%c is found in this link..\n", arg);

printf("second, while char you want to delete\n");
scanf("%c", &arg);
getchar();
del( &head, arg );

printf("element in the list is: \n");
print( &head );
free(head);
}

//前天晚上无聊写了一个,给楼主看看

链表实现添加,查找,和删除!!
dzy0451 2006-07-27
  • 打赏
  • 举报
回复
不好意思,忘了是单向链表了。发错了。
dzy0451 2006-07-27
  • 打赏
  • 举报
回复
设链表中的节点为如下的结构:
typedef struct node{
int data;
node * before;
node * next;
};
则向一个有序(由大而小)链表中插入节点的算法如下:
int insert(node * a, node * t_head){
int i = 0;
node * pt = t_head;

if(a == NULL || t_head == NULL)
return -1;

while(pt.next != NULL){
if(pt->data > a->data)
pt = pt->next;
if(pt->data < a->data){
a->next = pt;
pt->before->next = a;
break;
}
}
return 0;
}
xuxinmmy 2006-07-27
  • 打赏
  • 举报
回复
if( L==NULL )//当前链表没有元素
{
L = new LNode; // L = (LinkList)malloc(sizeof(LNode));
if(L)//申请空间成功
{
L->data = e; L->next = NULL; return true;//少了一个,加上
}
else return false;//申请空间失败
}
xuxinmmy 2006-07-27
  • 打赏
  • 举报
回复
这个应该很好弄的啊楼主...

设你的有序链表为L,要插入的元素为e

bool InsertNode(LinkList L,int e)
{
if( L==NULL )//当前链表没有元素
{
L = new LNode; // L = (LinkList)malloc(sizeof(LNode));
if(L)//申请空间成功
{
L->data = e; return true;
}
else return false;//申请空间失败
}
else//表中已经有元素
{
LinkList p = L;
LinkList q = p;
if(p->data <= e) //e大于等于第一个元素则要插到最前面
{
q = new LNode;
if(q == NULL) return false;//申请空间失败
q->data = e;
q->next = p;
L = q;
return true;
}
else//e小于第一个元素则住后插
{
while((p!=NULL) && (p->data > e))
{
q = p;//q记录要插位置的前一结点
p = p->next;
}
p = new LNode;
if(p = NULL) return false;//申请空间失败
p->data = e;
p->next = q->next;
q->next = p;
return true;
}
}
return false;
}

手写未经调试,楼主自己试试吧
链表的问题最好先画图搞清楚了再写
hearing 2006-07-27
  • 打赏
  • 举报
回复
哈哈。。。还是在说我啊。。。伤心ing~~~~~~~
aaalife 2006-07-27
  • 打赏
  • 举报
回复
yun...偶说得是楼上的楼上...
aaalife 2006-07-27
  • 打赏
  • 举报
回复
楼上的程序不好,
InsertList(&a,5,7); 具体插入的位置竟然是人为指定的!!这样能保证有序么?


加一个查找(定位)函数int Locate(..);
然后 InsertList(&a,Locate(..),insertElem);
hearing 2006-07-27
  • 打赏
  • 举报
回复
这是以前写的一个,建立一个链表,从小到大排列,插入一个节点之后还是有序的,你改改就行


#include <stdio.h>
#define MAX 10
struct node{
float num;
struct node* next;
}*link;
int main()
{
int i,j;
float f;
struct node *head;
struct node *tail;
struct node *p;
struct node *r;
clrscr();
p = (struct node*)malloc(sizeof(struct node));
head = p;
tail = p;
tail->next = NULL;
tail->num = 0;
for(i = 1;i < MAX; i++)
{
p = (struct node*)malloc(sizeof(struct node));
tail->next = p;
p->num = i;
p->next = NULL;
tail = p;
}
printf("input a value to insert (0--9):");
scanf("%f",&f);
p = head;
while(p&&p->num < f){
r = p;
p = p->next;
}
if(p){
p = (struct node*)malloc(sizeof(struct node));
p->num = f;
p->next = r->next;
r->next = p;
}else
{
printf("input err!\n");
return 0;
}

p = head;
while(p){
printf(" %f ",p->num);
p = p->next;
}
getch();
return 0;
}
daohua 2006-07-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct LNode /*定义结点*/
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

InitList(LinkList *L) /*初始化*/
{(*L)=(LinkList)malloc(sizeof(LNode));
if(!(*L)) return 0;
(*L)->next=NULL;
}
CreatList(LinkList *L,int n) /*建立*/
{ int i,e;
for(i=1;i<=n;i++)
{
scanf("%d",&e);
InsertList(L,i,e);
}
}

InsertList(LinkList *L,int i,ElemType e) /*把e插入第i个位置*/
{LinkList p,s;
int j=0;
p=*L;
while(p!=NULL && j<i-1){p=p->next;j++;}
if(p==NULL || j>i-1) return 0;
s=(LinkList)malloc(sizeof(LNode));
s->next=p->next;
p->next=s;
s->data=e;
return 1;
}
PrintList(LinkList *L) /*打印链表*/
{LinkList p;
for(p=(*L)->next;p;p=p->next)
printf(" %d",p->data);
}

void main()
{
LinkList a;
InitList(&a);
CreatList(&a,5);
InsertList(&a,5,7);
PrintList(&a);
}
jackiehua 2006-07-27
  • 打赏
  • 举报
回复
/*
*file JCDLinkList.c
*------------------
*这个文件实现JCDLinkList.h中的定义
*/


#include <stdio.h>
#include <stdlib.h>
#include "JCDLinkList.h"

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

/* 创建链表 */
LinkList CreateList()
{
LinkList P;
/* head tail 单独拿出来定义是为了表述清楚 */
Head head;
Tail tail;
head = tail = NULL;
int n;char c;
printf("input data \n");
while (scanf("%d",&n)>0)
{
P = (LinkList) malloc (sizeof(NODE));
P->data = n;
P->next = NULL;
if (head == NULL)
{
head = P;
tail = head;
}
else
{
tail->next = P;
tail = tail->next;
}
}
do
{
scanf("%c",&c);
}
while (c!= '\n');
return head;
}

/*
*打印链表
*/

void PrintList(LinkList X)
{
LinkList P;
P = X;
while (P!= NULL)
{
printf("%d\n",P->data);
P = P->next;
}
printf("\n");
}

/*打印单个节点 */
void PrintNode(LinkList P)
{
printf("single Node is :%d\n",P->data);
}

/*
*释放链表
*/
void FreeNode(LinkList x)
{
if (x != NULL)
free(x);
}

/*
*获取链表长度
*/
int GetListLength(Head head)
{
LinkList P;
int i = 0;
if (head != NULL)
{
P = head;
while(P)
{
P = P->next;
i = i+1;
}
}
return i;
}

/*
*获取第i个元素
*/
int GetElem(Head head,int n)
{
LinkList P;int i=0;
if (head != NULL)
{
P = head->next;
}
if (P != NULL)
{
for(i=0;i<n-1;i++)
{
P = P->next;
}
return P->data;
}
}

/*
*删除第n个节点
*/
Head DeleteNNode(Head head,int n)
{
LinkList P,Q;
P = head->next;
int i;
for (i=0;i<n-1;i++)
{
Q = P;
P = P->next;
}
Q->next = P->next;
FreeNode(P);
return head;
}

/*
*颠倒链表
*/
LinkList ReverseLink(Head head)
{
LinkList V1,V2,P;
V2 = head;
V1 = NULL;
while(V2)
{
/* P是为了存住当前的下个节点
* 节点往下移动
* V2是当前节点
*/

P = V2->next;

/*当前节点 的链接被更改 */
V2->next = V1;

/* 预备 下个节点 的next*/
V1 = V2;

V2 = P;
}
return V1;
}

/* 删除链表 */
void DeleteList(Head head)
{
LinkList P,tem;
P = head;
head->next = NULL;
while(P)
{
/*tem 用来记住下个节点 */
tem = P->next;
free(P);
P = tem;
}
}

/* 获取下个节点 */
LinkList GetNextNode(LinkList P)
{
return P = P->next;
}

/* 获取前个节点 */
LinkList GetPreviousNode(Head head,LinkList P)
{
LinkList tem,Q;
tem = head->next;
while(P!=tem)
{
Q = tem;
tem = tem->next;
}
return Q;
}


jackiehua 2006-07-27
  • 打赏
  • 举报
回复
/*
*file JCDLinkList.h
*------------------
*这个文件JCD写的链表定义操作的接口文件
*2006-7-23
*/

#ifndef _JCDLinkList_h
#define _JCDLinkList_h

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

/*
*链表的数据类型定义
*/

typedef struct node NODE;
typedef NODE *LinkList;


/*
*头节点 Head
*尾节点 Tail
*/
typedef LinkList Head;
typedef LinkList Tail;



/*创建一个新的链表
*函数 CreateList
-------------------
*用法 NewLinkList = CreateList
*/

LinkList CreateList();

/*
*输出一个链表
*函数 PrintList
*用法 PrintList(P);
*/

void PrintList(LinkList X);


/*
* 打印单个节点的数值
* 函数 PrintNode
*/
void PrintNode(LinkList P);

/*
*释放一个节点
*函数 FreeNode
-------------------
*用法 FreeNode(Node)
*/

void FreeNode(LinkList x);


/*
*获取链表的长度
*函数 GetListLength
--------------------
*用法 int i=GetListLength(Head head)
*/
int GetListLength(Head head);


/*
*获取链表中指定位置的元素
*函数 GetElem
*/
int GetElem(Head head,int n);

/*
*删除第n个节点
*/
Head DeleteNNode(Head head,int n);

/*
*链表倒序
*函数 ReverserLink(Head head)
*/
LinkList ReverseLink(Head head);

/*
*释放链表
*函数 DeleteList(Head head)
*/
void DeleteList(Head head);

/*
*获取下个节点
*函数 GetNextNode(LinkList P);
*/
LinkList GetNextNode(LinkList P);

/*
*获取前个节点
*函数 LinkList GetPreviousNode(Head head,LinkList P)
*/
LinkList GetPreviousNode(Head head,LinkList P);




#endif

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧