Ⅰ c語言編程問題 鏈表
鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。
鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。
每個結點包括兩個部分:
1、存儲數據元素的數據域;
2、存儲下一個結點地址的指針域。
在C語言中,鏈表的構建是通過結構體實現的,一個結構體變數,形成一個鏈表的節點。
在結構體內,需要由至少一個類型為結構體本身類型的指針的元素,作為指針域存在,用來指向下一個或者上一個(僅用於雙向鏈表)元素節點。
Ⅱ 急急急!!!!用c語言實現字典 要求:用無序雙向循環鏈表實現字典的基本操作如下
#include <stdafx.h> //這行是VC編譯時要的頭文件,你若TC就不要本行了
#include <stdio.h>
typedef struct dictnode{char *key; char *value; dictnode *pre; dictnode *next;} DictNode;
DictNode *pHead = NULL;
//(1)make:構造空的字典
int make()
{
if(pHead)return -1;
pHead = (DictNode*)malloc(sizeof(DictNode));
memset(pHead,0,sizeof(DictNode));
pHead->pre = pHead;
pHead->next = pHead;
return 0;
}
//(2)size:返回字的字典中記錄數
int size()
{
int i;
DictNode*p;
for(i=0,p=pHead; p->next!=pHead; p=p->next,i++);
return i;
}
//(3)IsEmpy:如果字典為空則返回真,否則返回假
int IsEmpy()
{
return (pHead->pre==pHead);
}
//(4)Clear:將字典重置為空
void Clear()
{
DictNode* p,*ptmp;
for(p=pHead->next; p!=pHead ; )
{
ptmp = p;
p = p->next;
free(ptmp->key);
free(ptmp->value);
free(ptmp);
}
pHead->next = pHead->pre = pHead;//最後一個空節點也是第一個節點
}
//(5)Insert:插入記錄到字典
int Insert(char *key,char*value)
{
DictNode* p, *ptmp;
if(!key||!value||!*key||!*value) return -100;//調用錯誤
ptmp = (DictNode*)malloc(sizeof(DictNode));
if(!ptmp) return -2; //內存不足這種極端的情況很難出現,但有可能
memset(ptmp,0,sizeof(DictNode));
ptmp->key =(char*) malloc(strlen(key)+1);
if(!ptmp->key){free(ptmp);return -2;} //內存不足這種極端的情況很難出現,但有可能
strcpy(ptmp->key,key);
ptmp->value = (char*)malloc(strlen(value)+1);
if(!ptmp->value){free(ptmp->key);free(ptmp); return -2;} //內存不足這種極端的情況很難出現,但有可能
strcpy(ptmp->value,value);
for(p=pHead->next; p->next!=pHead; p=p->next) if(p->key&&!strcmp(p->key,key)) return 1;//記錄存在,插入失敗
ptmp->next = pHead; pHead->pre = ptmp;
ptmp->pre = p; p->next = ptmp;
return 0;//操作成功返回0
}
//(6)remove:與給定關鍵字的記錄相同則刪除,該記錄被返回,否則字典保持不變
DictNode* remove(char *key)
{
DictNode* p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
if(p==pHead) return NULL;
p->pre->next = p->next;
p->next->pre = p->pre;
p->pre = p->next = NULL;
return p;//結點p的空間(key value p三個)沒有釋放,外面要接收返回值並主動釋放結點空間或做別的處理如插入另一表中等
}
//(7)IsPrensent:如果存在與給定關鍵字匹配的記錄則返回真,否則返回假
int IsPrensent(char *key)
{
DictNode* p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
return (p!=pHead);
}
//(8)Find:如果存在與給定關鍵字相同的記錄,則返回記錄;如果沒有找到,則返回空
DictNode* Find(char *key)
{
DictNode* p;
for(p=pHead->next; p!=pHead&&strcmp(p->key,key); p=p->next);
if(p==pHead) return NULL;
return p; //不要對Find返回的記錄key值做變更,value值可以修改,value加長時要重新分配空間。因為記錄還在字典鏈表中
}
void main()
{
const char *prtstr = "****************************";
DictNode* ptmp;
char keybuf[80];
char valuebuf[1024];
int c;
make();
while(1)
{
system("cls");//清屏
printf("%s 選擇菜單 %s",prtstr,prtstr);
printf("\n\tF---詞條查找\n\tI---插入新詞條\n\tR---刪除詞條\n\tC---清空字典\n\tS---顯示字典詞條數\n\tQ---退出\n");
printf("請選擇操作菜單:");
fflush(stdin);
c = getchar();
if(c>='a'&&c<='z') c -= ('a'-'A');//換大寫
if(c!='F'&&c!='I'&&c!='R'&&c!='C'&&c!='S'&&c!='Q') continue;
fflush(stdin);
switch(c)
{
case 'F':
printf("詞條查找:\n請輸入Key值:");scanf("%s",keybuf);
fflush(stdin);
ptmp = Find(keybuf);
if(ptmp){printf("Key:%s Value:%s",ptmp->key,ptmp->value);}
else{printf("沒找到詞條:%s,你可以先選擇插入這個新詞條",keybuf);}
break;
case 'I':
printf("插入新詞條:\n請輸入Key值:");scanf("%s",keybuf);
fflush(stdin);
if(IsPrensent(keybuf)){printf("詞條%s已存在\n",keybuf);}
else
{
printf("請輸入它的解釋:");gets(valuebuf);
if(!Insert(keybuf,valuebuf))printf("插入成功\n");
else printf("插入失敗\n");
}
break;
case 'R':
printf("刪除詞條:\n請輸入Key值:");scanf("%s",keybuf);
fflush(stdin);
ptmp = remove(keybuf);
if(ptmp)
{
free(ptmp->value);free(ptmp->key);free(ptmp);
printf("記錄key:[%s]已刪除\n",keybuf);
}
else
printf("未找到待刪除的記錄key:[%s]\n",keybuf);
break;
case 'C':
printf("清空字典:\n真的要清嗎?\n請輸入Yes以確認刪除操作(首字母大寫):");scanf("%s",keybuf);
fflush(stdin);
if(strcmp(keybuf,"Yes")){printf("放棄了清空操作\n");}
else {Clear();printf("Ok,你堅持操作,現在字典已清空了\n");}
break;
case 'S':
printf("顯示字典詞條數:\n當前詞條總數:%d\n", size());
break;
case 'Q':
Clear(); free(pHead);
printf("Byebye");
exit(0);
}
printf("\n按回車鍵繼續......");
fflush(stdin);
getchar();
}
}
//VC7.1 下調試通過,運行功能正常
Ⅲ 順序表和鏈表的基本操作,用C語言實現!
順序存儲的線性表的演算法
#include "stdio.h"
#include "stdlib.h"
#define Status int
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define MAXSIZE 100
typedef int ElemType;
typedef struct list
{ElemType elem[MAXSIZE];
int length;
}SqList;
void InitList(SqList &L){
L.length=0;
}
/*建立順序表*/
void CreateList(SqList &L)
{
int i;
printf("input the length");
scanf("%d",&L.length);//輸入表長
for(i=1;i<=L.length;i++)
scanf("%d",&L.elem[i-1]);//輸入元素
}
//順序表的遍歷
void printdata(ElemType e){
printf("%4d",e);
}
void Traverse(SqList L,void (*visit)(ElemType e))
{ int i;
printf("The elements of the lists are:\n");
for(i=1;i<=L.length;i++){
if (i%10==0)printf("\n");//每行顯示10個元素
visit(L.elem[i-1]);//輸出表中元素
}
printf("\n");
}
//有序順序表L中插入元素e使序列仍有序
void Insert(SqList &L,ElemType e)
{int i,j;
if (L.length==MAXSIZE)exit(OVERFLOW);//表滿,不能插入
for(i=1;i<=L.length&&L.elem[i-1]<=e;i++);//向後查找
for(j=L.length;j>=i;j--)
L.elem[j]=L.elem[j-1];//元素後移
L.elem[i-1]=e;//插入e
L.length=L.length+1;//表長加1
}
//建立遞增有序的順序表
void CreateList_Sorted(SqList &L)
{int i,num;
ElemType e;
L.length=0;
printf("Create a sorted list,Input the length of the list\n");
scanf("%d",&num);
printf("Input the data %d numbers\n",num);
for(i=1;i<=num;i++){
scanf("%d",&e);
Insert(L,e);
}
}
/*Merge two sorted lists*/
void MergeList(SqList La,SqList Lb,SqList &Lc)
{int *pa,*pb,*pc;
if (La.length+Lb.length>MAXSIZE) exit(OVERFLOW);
else
{pa=La.elem;pb=Lb.elem;pc=Lc.elem;
while (pa<La.elem+La.length&&pb<Lb.elem+Lb.length)
*pc++=(*pa<=*pb)?*pa++:*pb++;/*公共部分合並*/
while (pa<La.elem+La.length) *pc++=*pa++;
/*R1表的剩餘部分放到R的後部*/
while (pb<Lb.elem+Lb.length) *pc++=*pb++;
/*R2表的剩餘部分放到R的後部*/
Lc.length=La.length+Lb.length;/*R表長*/
}
}
//判斷元素是否對稱,對稱返回TRUE 否則返回FALSE
Status Symmetric(SqList L)
{int low,high;
low=0;
high=L.length-1;
while(low<high)
if (L.elem[low]==L.elem[high]){low++;high--;}
else return(FALSE); return(TRUE); }
//順序表的主函數部分
//#include "seqlist.h"
void main()
{SqList L1,L2,L;
int select;
ElemType e;
do{printf("\n1 insert 2 merge");
printf("\n3 symmetric 0 exit \n");
printf("Please select(0--3)\n");
scanf("%d",&select);
switch(select){
case 1:
InitList(L);
CreateList_Sorted(L);
Traverse(L,printdata);
printf("\nInput the element of inserted\n");
scanf("%d",&e);
Insert(L,e);
Traverse(L,printdata);
break;
case 2:
InitList(L1);
CreateList_Sorted(L1);
Traverse(L1,printdata);
InitList(L2);
CreateList_Sorted(L2);
Traverse(L2,printdata);
InitList(L);
MergeList(L1,L2,L);
Traverse(L,printdata);
break;
case 3:
InitList(L);
CreateList(L);
Traverse(L,printdata);
if (Symmetric(L)) printf("Yes!\n"); else printf("Not\n");
break;
case 0:break;
default:printf("Error! Try again!\n");
}
}while(select);
}
/*單向鏈表的有關操作示例*/
/*類型定義及頭文件部分,文件名為sllink.h*/
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;//元素實際類型
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList; //定義結點、指針類型名
//頭插法建立無序鏈表
void CreateList(LinkList &L){
LinkList p;
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("頭插法建立鏈表,以0結束\n");
scanf("%d",&e);
while(e){
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
p->next=L->next;
L->next=p;
scanf("%d",&e);
}
}
/*非遞減有序單向鏈表L插入元素e序列仍有序*/
void Insert_Sort(LinkList &L,ElemType e){
LinkList p,s;
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
p=L;
while(p->next&&p->next->data<=e)
p=p->next;/*查找插入位置*/
s->next=p->next; /*插入語句*p結點後插入*s結點*/
p->next=s;
}
/*建立遞增有序的單向鏈表*/
void Create_Sort(LinkList &L){
ElemType e;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("建立有序表,輸入任意個整型數據以0結束\n");
scanf("%d",&e);
while(e){
Insert_Sort(L,e);
scanf("%d",&e);
}
}
/*單向鏈表的遍歷*/
void Traverse(LinkList L){
LinkList p;
printf("遍歷鏈表");
for(p=L->next;p;p=p->next)
printf("%5d",p->data);
printf("\n");
}
/*在單向鏈表刪除元素e*/
void Delete(LinkList &L,ElemType e){
LinkList p,q;
p=L;
q=L->next;
while(q&& q->data!=e){//查找元素的刪除位置
p=q;
q=q->next;
}
if(!q) printf("\nnot deleted");/*未找到元素e*/
else {p->next=q->next;/*找到刪除*/
free(q);}
}
/*單向鏈表的逆置*/
void exch(LinkList &L){
LinkList p,s;
p=L->next;
L->next=NULL;
while(p){
s=p;
p=p->next;
s->next=L->next;
L->next=s;
}
}
/*兩個非遞減有序單向鏈表合並後仍為非遞減序列*/
void MergeIncrease(LinkList La,LinkList Lb,LinkList &Lc){
LinkList p,q,s,rear;
p=La->next;
q=Lb->next;
Lc=rear=La;
free(Lb);
while(p&&q){
if (p->data<q->data) {s=p;p=p->next; }
else {s=q;q=q->next; }
rear->next=s;/*較小元素插入表尾*/
rear=rear->next;
}
if (p) rear->next=p; else rear->next=q;
}
/*主函數部分,文件名為sllink.c*/
//#include "sllink.h"
void main(){
LinkList La,Lb,Lc;
ElemType e;
int select;
do{
printf(" 1 建立無序表,再刪除指定元素\n");
printf(" 2 建立遞增有序表,再逆置\n");
printf(" 3 建立兩個遞增有序表,將它們和並為一個仍遞增表\n");
printf(" 0 退出,請輸入選項(0-3)\n");
scanf("%d",&select);
switch(select){
case 0:
break;
case 1:
CreateList(La);
Traverse(La);
printf("輸入需刪除的元素\n");
scanf("%d",&e);
Delete(La,e);
Traverse(La);
break;
case 2:
Create_Sort(La);
Traverse(La);
exch(La);
printf("The list that is exchaged\n");
Traverse(La);
break;
case 3:
Create_Sort(La);Traverse(La);
Create_Sort(Lb);Traverse(Lb);
MergeIncrease(La,Lb,Lc);Traverse(Lc);
break;
default:
printf("輸入選項錯誤,請重新輸入!\n");
}
}while(select);
}
這些內容不知道能不能幫助到你。
Ⅳ 如何用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;
}